JAXB là gì?

XML là đã được phổ biến rộng khắp, nó đã trở thành một chuẩn cho việc trao đổi dữ liệu với nhau, hoạt động trên mọi môi trường, nó sáng sủa, dễ hiểu và thuần text.

Highslide JS

Tuy nhiên, thao tác dữ liệu trên xml không phải dễ dàng, với việc sử dụng thao tác trên cây DOM khiên bạn gặp nhiều rủi ro khi thao tác trên dữ liệu lớn là điều khó tránh khỏi, hơn hết, nó làm mã chương trình của bạn rối rắm, thao tác giữa đọc và ghi dữ liệu dường như bị tách biệt hoàn toàn.

Đôi khi bạn cũng không thể hình dung được tài liệu đó lớn đến mức nào, DOM hay SAX, cũng đủ để khiến bạn bối rối, việc hình dung và cách sử dụng 2 hình thức thao tác xml này cũng khác nhau.

JAXB là một thư viện giúp ánh xạ XML thành đối tượng, nó giúp chúng ta thay thế việc thao tác dữ liệu, thuộc tính trên các thẻ XML bằng thao tác trên phương thức và thuộc tính của đối tượng.

Cũng không hẳn như vậy, hãy nhìn lại ORM và JDBC, trong trường hợp này nó khá giống với XOM và XML, JAXB giống với Hibernate theo một cách nhìn nào đó, JDBC hay Hibernate hay hơn, câu trả lời của nó tương tự như bạn lựa chọn DOM/SAX hay JAXB cho giải pháp của mình.

Hãy nhìn sơ file xml sau:

Trong demo này tôi sẽ làm một trường hợp cấu hình, chúng ta có các thẻ :

:Datasource(Thuộc tính : bean)/name+jndiName

Controller/binding+id

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<configuration>

<datasource bean="BeanFactoryJboss">

<name>jdbc/database/connection</name>

<jndiName>JNDI_NAME_JBOSS</jndiName>

</datasource>

<datasource bean="BeanFactoryOracle">

<name>jdbc/oracle/connection</name>

<jndiName>JNDI_NAME_OC4J</jndiName>

</datasource>

<controller>

<binding>userid</binding>

<id>1</id>

</controller>

</configuration>

Đối với một file XML thì well-form không thì chưa đủ, thông thường nó cần một ràng buộc thông qua một schema.

config.xsd

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name="Configuration">

<xsd:sequence>

<xsd:element name="datasource" maxOccurs="unbounded" type="Datasource">

</xsd:element>

<xsd:element name="controller" type="Controller"></xsd:element>

</xsd:sequence>

</xsd:complexType>

<xsd:complexType name="Datasource">

<xsd:sequence>

<xsd:element name="name" type="xsd:string"></xsd:element>

<xsd:element name="jndiName" type="xsd:string"></xsd:element>

</xsd:sequence>

<xsd:attribute name="bean" type="xsd:string" default="langthang"></xsd:attribute>

</xsd:complexType>

<xsd:element name="configuration" type="Configuration"></xsd:element>

<xsd:complexType name="Controller">

<xsd:sequence>

<xsd:element name="binding" type="xsd:string"></xsd:element>

<xsd:element name="id" type="xsd:int"></xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:schema>


Để hiểu kỹ hơn về XML shema bạn có thể xem thêm ở đây hoặc Schema Tutorial

Bạn không cần bất kỳ một thư viện mở rộng nào để chạy ứng dụng XOM này, vì nó đã được cài đặt trong thư viện của sun.

Giờ đây tôi sẽ nói lần lượt thứ tự để bạn có thể tạo một ứng dụng demo với JAXB.

Bạn sẽ bắt đầu với chỉ file schema-XSD.

Để thao tác hướng đối tượng, bạn cần phải có các class, chuyện đương nhiên, để có các class này chúng ta phải sử dụng một thư việc hỗ trợ việc generate code.

· Bạn cài đặt JWSDP 1.5 (Java Web Services Developer Pack) được download từ http://java.sun.com vào trong thư mục c:\Sun\jwsdp-1.5 (hãy thay đổi nó theo ý bạn, lưu ý để tránh rắc rối đừng đặt nó trong thư mục có khoảng trắng).

· Tạo biến môi trường JWSDP_HOME = c:\Sun\jwsdp-1.5. Add JWSDP_HOME\bin vào PATH.

Bạn chạy lệnh xjc -p com.demo config.xsd

(Trong thực tế chúng ta sẽ dùng một file ANT để generate code này)

Bạn sẽ chạy ứng dụng generate này bằng lệnh xjc, nếu máy tính không nhận biết được lệnh này, bạn vui lòng xem lại Path đã được cấu hình đúng chưa.

Tôi giải thích sơ lược lệnh này:

    -p : tham số chỉ định các class sẽ đươc đặt trong package nào.

    Config.xsd là file shema đã nói ở trên.

Còn những tham số hữu dụng khác, bạn có thể tham khảo khi đánh lệnh xjc không tham số.

Highslide JS

Copy vào thư mục source, và ở trên là kết quả của bạn.

Chạy chương trình:

JAXB có 2 thao tác chính:

    * Marshal để ghi dữ liệu xuống file XML.
    * UnMarshal để đọc dữ liệu XML và map vào object.

public void marshall(String fileName) throws Exception {

JAXBContext jb = JAXBContext.newInstance("com.demo");

Marshaller mar = jb.createMarshaller();

mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//Đối tượng quan trọng.

ObjectFactory of = new ObjectFactory();

Configuration con = of.createConfiguration();

//Tạo một marshaller cho ghi file xml, xuất dưới dạng được format.

Marshaller marshaller = jb.createMarshaller();

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

//Thao tác trên thẻ datasource

Datasource ds = of.createDatasource();

ds.setJndiName("JNDI_NAME_JBOSS");

ds.setName("jdbc/database/connection");

ds.setBean("BeanFactoryJboss");

Datasource ds2 = of.createDatasource();

ds2.setJndiName("JNDI_NAME_OC4J");

ds2.setName("jdbc/oracle/connection");

ds2.setBean("BeanFactoryOracle");

//Thao tác trên thẻ controller

Controller control = of.createController();

control.setBinding("userid");

control.setId(1);

con.setController(control);

con.getDatasource().add(ds);

con.getDatasource().add(ds2);

//Ghi xuống file.

File filex = new File(fileName);

marshaller.marshal(con, filex);

}


Tôi sẽ tạo file config.xml từ thông tin trên.

public static void main(String[] args) throws Exception {

Main main = new Main();

main.marshall("config.xml");

}


Kết quả bạn đã thấy trong file xml đầu tiên của chương trình.

Tương tự với thao tác ngược lại, rất quan trọng, là đọc dữ liệu xml vào object

public void unMarshall(String fileName) throws Exception {

JAXBContext jb = JAXBContext.newInstance("com.demo");

Marshaller mar = jb.createMarshaller();

mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

ObjectFactory of = new ObjectFactory();

Configuration con = of.createConfiguration();

Unmarshaller unmarshaller = jb.createUnmarshaller();

File file = new File(fileName);

JAXBElement<?> configElement = (JAXBElement<?>) unmarshaller

.unmarshal(file);

con = (Configuration) configElement.getValue();

List<Datasource> dss = con.getDatasource();

Controller controller = con.getController();

System.out.println(controller.getBinding());

String jndi = dss.get(1).getJndiName();

String name = dss.get(1).getName();

System.out.println(jndi);

System.out.println(name);

}


Tới đây, Bạn đã thấy sự tiện dụng của JAXB là như thế nào, chúng ta có một schema và như thế chúng ta bắt đầu hành trình xử lý XML của mình.

Download Demo project

JAXB ứng dụng ở đâu.

Và đương nhiên, JAXB không phải là một viên đạn bạc cho XML, trong thực tế, với ví dụ này, việc sử dung JAXB bạn đã mang tư tưởng Overkill trong hệ thống của mình. Nếu chỉ đơn giản đọc thông tin cấu hình, dom là đủ.

Với tôi, tôi sẽ sử dụng JAXB trong ứng dụng có Webservices, giả sử tôi có một web service thông qua một WSDL URL. Như bạn thấy, dù nó được host trên .NET hay java hay một ngôn ngữ nào khác, tất cả sẽ thành object trong java cho bạn.

Còn những trường hợp khác, sự lựa chọn vẫn tùy thuộc vào bạn.
Bookmark and Share AddThis Feed Button FeedBurner Button
IT » Java | Nhận xét(866) | Trích dẫn(0) | Đọc(10653)
8gEShh6i43l9 Email Homepage
2017/11/03 02:50
Lactate transporters in the heart and in skeletal muscle respond to exercise in different ways. The  heart responds at much lower levels of exercise intensity to increase its concentration of the lactate transporters that combat fatigue and improve heart function.
RZWjiUJmuwhu Email Homepage
2017/11/02 20:32
Nice looking phone, though I&#39;m an iPhone girl. But if I had to choose something else this looks a good bet! I know what you mean about getting absorbed into your phone when you get a new one. I remember when I went from an old Nokia to my iPhone 3GS - I opened the box on the bench in the mall!!
o8kiPWdzJ Email Homepage
2017/10/31 11:41
Ou não percebo é porque é que a UAUM recebeu o louvor, tendo em conta que é uma dependência da Universidade. Não é organismo autónomo, é da universidade. Quem deveria receber o prémio seria a Universidade representada pelo seu dirigente máximo que é o Reitor.
bUOhuCukl Email Homepage
2017/10/30 23:52
An fascinating discussion is value comment. I think that you should write extra on this matter, it might not be a taboo topic but usually individuals are not enough to talk on such topics. To the next. Cheers
NNKrfarXTek Email Homepage
2017/10/30 01:32
disse:Só para completar: A capacidade de individamento da população está no limite e as altas taxas de crescimento que teremos este ano, tendem a decrescer devido a diminuição de nossas exportações.
EVWvkJxKaj68 Email Homepage
2017/10/29 22:21
michigan_8_mile_road &#65306;你說的真有意思&#65292;&#12302;鬼地方&#12303;也是我對今時今日香港的心底話&#65281;香港回歸至今&#65292;真是變成一個鬼地方&#12290;大陸一定會取代香港&#65292;一定&#65292;只是時間問題&#65292;並且在可見將來一定會取代香港&#12290;這個步伐已越來越快&#12290;原因很簡單&#65292;香港要獨當一面&#65292;一定要有優勢&#65292;但本港所謂優勢&#65292;越來越少&#12290;曾有不止一個&#12302;港女&#12303;罵我&#65306;&#12302;香港有很多優勢&#65292;大陸無可能取代香港&#65281;&#12303;&#12290;因為佢地搵到符合女性市場嘅好工&#65292;自然覺得香港無問題&#12290;
nIBotxP2 Email Homepage
2017/10/29 18:54
I agree with everything you said John. Unfortunately, the dark side is also starting to surface. I&#8217;d heard several reports of price gouging, especially in Tokyo. Then, since the first earthquake I&#8217;ve been searching everywhere for camping gas canisters. There were none in my local area so I was forced to order some from a retailer on Amazon. In the end,  I only bought a pack of three. Usual price, about Â¥1,000. This week&#8217;s price, Â¥3,780&#8230;
iUvb5A4yhBt Email Homepage
2017/10/29 13:44
That is very attention-grabbing, You are an overly skilled blogger. I&#8217;ve joined your rss feed and look forward to in search of more of your wonderful post. Additionally, I have shared your web site in my social networks!
KYiAbn3V Email Homepage
2017/10/29 07:31
Hi Wei,I am sooo happy to know that your university received a hefty grant, that’s truly a big leap to further clinical trials for stem cells research… Congratulations!Please do continue what you are doing for the MM cure, I’m sure everyone here who cares for Lisa’s health greatly and deeply appreciated it as well. Giving you a big round of applause,&#8212;NP&#8211;
SiHvWZq4Lc40 Email Homepage
2017/10/29 06:31
Siis luomu-etuliitteellähän tarkoitetaan luonnonmukaisesti viljeltyjä ja/tai tuotettuja elintarvikkeita ja muita kulutustuotteita.Edes metsästä poimittu mustikka ei ole luomua, ellei sitä metsäplänttiä ole erikseen luomuvalvonnan alaiseksi haettu ja hyväksytty. Tuskin nämä "luomu"tissit ovat läpikäyneet viranomaistarkastusta saadakseen luvan luomu-sanan käyttöön.Byrokraattinen termi siis kyseessä. Kuka kertoisi keltaiselle lehdistölle, että he väärinkäyttävät asetuksissa ja EU-direktiiveissä säädettyä termiä?Terveisin (toinen) luomuopiskelija
Phân trang 1/87 Trang đầu 1 2 3 4 5 6 7 8 9 10 Trang sau Trang cuối
Viết nhận xét
Hình vui
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
Mở HTML
Mở UBB
Mở hình vui
Ẩn giấu
Tên gọi   Mật khẩu   Khách không cần mật khẩu
Địa chỉ web   Email   [Đăng ký]
               

Mã kiểm tra Không phân biệt font chữ