JAXB và kỹ thuật Object XML mapping

Java Architecture for XML Binding (JAXB)

Kỹ thuật Object XML mapping (OXM).

clip_image002

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.

 

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ố.

clip_image004

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.

About Langthang

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

4 comments :