วันอังคารที่ 13 กันยายน พ.ศ. 2554

ตัวอย่างการทำงานโดยใช้ JAXB

เมื่อได้รู้จักกับ JAXB คร่าวๆไปแล้ว คราวนี้เรามาดูตัวอย่างการใช้ JAXB กันนะค่ะ
ก่อนอื่น เราต้องมี XML Schemas ก่อน ในตัวอย่างที่ยกมา นำมาจาก http://www.w3schools.com/schema/schema_example.asp

เปิดโปรแกรม NetBeans IDE 6.9.1 และทำการ New Project..
เลือกสร้างโปรเจคแบบ Java Application แล้ว Next

ใส่ชื่อ Project Name คลิก Finish 

หลังจากสร้างโปรเจคเสร็จแล้ว ก็ทำการนำ XML Schemas เข้ามาในโปรเจค โดยการคลิก New File เลือก Categories  : XML และ File Type: JAXB Binding คลิก Next

ตั้งชื่อ Binding Name และทำการ Browse File .xsd ซึ่งเป็น XML Schemas เข้ามา คลิก Finish

เมื่อทำการเลือกไฟล์ .xsd เข้ามาแล้ว ถ้า Complie ผ่าน โปรแกรมจะทำการ Generate Source ขึ้นมาให้ดังภาพ

วิธีการสร้างไฟล์ XML จาก Object ในภาษาJava (Mashalling)

เราจะสร้าง Object  ของ class Itemtype ใน Main Program ซึ่งเป็นหนึ่งใน class ที่ถูกสร้างขึ้นจาก XML Schema โดยใช้ ObjectFactory
พิมพ์คำว่า “jaxbm” แล้วกด tab ใน Main program ซึ่งเป็นการ Marshal ที่ Netbean เตรียมไว้จะขึ้นมาดังภาพ
เมื่อ Run ผ่านจะได้ดังรูป

เราต้องการสร้างไฟล์ XML ออกมาด้วย ให้เปลี่ยนในส่วน System.out เป็น FileOutputStream เพื่อทำการสร้างไฟล์
แล้วเราจะได้ไฟล์ .xml โดยมี source code ข้างในดังภาพ

วิธีการแปลงไฟล์ XML ให้เป็น Object ในภาษา Java (Unmarshalling)
ก่อนอื่นเราต้องมีไฟล์ XML ก่อน
แล้วทำการพิมพ์ “jaxbu” และกด tab จะได้ code ดังภาพขึ้นมา ให้ทำการแก้ไข path ที่ทำการเรียกไฟล์ ดังตัวอย่างเรียกจาก D:\\
เพิ่มในส่วนของการแสดงผลดังภาพ
เมื่อทำการรัน จะได้ผลดังภาพ


วันจันทร์ที่ 12 กันยายน พ.ศ. 2554

ทำความรู้จักกับ JAXB

     สถาปัตยกรรมจาวาสำหรับการblinding XML(JAXB) ได้ทำให้ เชื่อมระหว่าง XML Schemas และ java ให้เป็นไปอย่างสะดวกและเร็ว  ทำให้ผู้พัฒนาจาวาสามารถเชื่อมระหว่างข้อมูลXMLและการประมวลผลในจาวาเข้าไว้ด้วยกัน และหนึ่งในprocessนี้ JAXBได้ทำให้เราสามารถunmarshal xml instance document เป็น java content tree และ marshal java content tree กลับไปเป็น XML instance document และ JAXB ทำให้เราสามารถสร้าง XML schema จาก java object ได้อีกด้วย


JAXB Architecture
ส่วนประกอบและการทำงานต่างๆในการประมวลผลJAXB Mode
  1. Schema compiler : ทำหน้าที่ ผูกระหว่างsource schema กับ set ของ schema-derived program elements   ซึ่งการผูกนี้จะถูกเขียนด้วยภาษา XML-based binding language
  2. Schema generator : จะจับคู่ระหว่างกลุ่มของโปรแกรมelement ที่มีอยู่แล้ว ไปยัง derived schema ซึ่งส่วนmappingนี้จะถูกเขียนด้วย program annotations
  3. Binding runtime framework : ทำให้เราสามารถ unmarshalling (reading) กับ marshalling (writing)เพื่อเข้าถึงข้อมูล XML โดยใช้ทั้ง schema-derived หรือ program elementsที่มีอยู่แล้ว
The JAXB Binding Process

ขั้นตอนการทำ Binding ของ JAXB data
  1. Generate class: (สร้างclass) xml schema จะใช้เป็น input ให้กับ JAXB binding compiler เพื่อสร้าง JAXB class ที่มีพื้นฐานมาจาก schema นั้น
  2. Compile classes: ทุกclassที่ถูก generate(สร้าง)ขึ้นมา จะต้องถูกcompileในขั้นตอนนี้
  3. Unmarshal: เอกสารxml ที่ถูกเขียนโดยมีข้อจำกัดตามแหล่งschemaนั้นๆ จะถูกunmarshalโดย JAXB binding framework JAXB ยังรองรับการ unmarshall จากแหล่งข้อมูลxmlอื่นๆนอกจากเอกสารและdocument เช่น DOMnodes, string buffers,SAX Sources, and so forth
  4. Generate content tree: ขั้นตอนในการ unmarshal จะสร้าง content tree ของ data object โดย instantiatedจาก JAXB classesที่ถูกสร้างขึ้นมา content  tree นี้เป็นตัวแทนของโครงสร้างเนื้อหาจากxml ต้นฉบับ
  5.  Validate (optional): ขั้นตอนการ unmarshal ก่อนที่จะสร้างcontent treeอาจจะ validate ก่อนก็ได้ ถ้าคุณแก้ไข content tree ในขั้นตอนที่6ข้างล่างนี้ คุณจะสามารถใช้ คำสั่ง validate JAXB ก่อนที่จะ marshal ข้อมูลกลับไปเป็น XMLได้ด้วย
  6. Process content: client application จะสามารถแก้ไขข้อมูลXMLที่ถูกนำเสนอโดย Java content tree ผ่านinterface ที่สร้างโดย binding compiler ได้
  7. Marshal: content tree ที่ประมวลผลแล้ว จะถูกmarshalลงเป็นXML output  1อัน หรือมากกว่านั้น  และ content นี้จะถูก validate ก่อน marshal
NOTE ::
  • Unmarshalling : การ Unmarshalling ทำให้ application clientสามารถเปลี่ยนข้อมูลxml ไปเป็น JAXB-derived Java objectsได้ (java objectที่ถูกแปลงมา)
  • Marshalling : การ Marshalling ทำให้application clientแปลงจากJAXB(java object ที่ถูกแปลงมา)ไปเป็นข้อมูลXMLโดยปกติแล้วMarshallerจะใช้การเข้ารหัสแบบUTF8ตอนที่สร้างข้อมูลXML
    • Client appไม่จำเป็นต้อง Validate java content tree ก่อนที่จะmarshal จาวา ไม่จำเป็นต้อง valid เมื่อมันถูกแปลงกลับไปเป็น XML
  • Validation : ขั้นตอนการ validation คือขั้นตอนในการตรวจสอบว่าข้อมูล XML ที่นำมาใช้นั้น ตรงตามข้อจำกัดที่ถูกกำหนดไว้ใน schema หรือไม่
    • JAXB 1.0 นั้นจะ validation ขณะกำลัง unmarshal และสามารถเปิดใช้ได้ตามต้องการเมื่อต้องการจะ validaition JAXB content tree
    • JAXB 2.0 จะอนุญาตเฉพาะการ validation ขณะ unmarshal หรือ marshal เท่านั้น
    • โมเดล web service นั้นจะพิถีพิถันในเรื่องการอ่านและเขียน เพื่อให้ตรงตามโมเดล Validation จะถูกทำขณะ marshal เพื่อที่จะยืนยันได้ว่า XML นั้นผ่านเงื่อนไขจริงๆเมื่อกำลังแปลงมันไปเป็นรูป JAXB
Binding XML Schemas
Default DataType Binding
     ในส่วนนี้จะอธิบายถึง  schemaไปเป็นJAVA, JAXBElement, และJAVA ไปเป็นschema
  • Schema-to-Java Mapping
        ตัวอย่าง JAXB Mapping of XML Schema Built-in Data Types

XML SchemaType
Java DataType
xsd:string
java.lang.String
xsd:integer
java.math.BigInteger
xsd:int
int
xsd:double
double
xsd:QName
javax.xml.namespace.QName
xsd:dateTime
javax.xml.datatype.XMLGregorianCalendar
xsd:unsignedInt
long
xsd:time
javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType
java.lang.Object
xsd:NOTATION
javax.xml.namespace.QName


  • Java-to-Schema Mapping
             ตัวอย่าง JAXB Mapping of XML Data Types to Java Classes
Java Class
XML DataType
java.lang.String
xs:string
java.math.BigInteger
xs:integer
java.util.Calendar
xs:dateTime
java.net.URI
xs:string
javax.xml.datatype.XMLGregorianCalendar
xs:anySimpleType
java.lang.Object
xs:anyType
java.awt.Image
xs:base64Binary
java.util.UUID
xs:string


Customizing Generated  Classes and Java Program Elements
การปรับแต่งclass และ Java Program Element
Schema-to-Java
การปรับแต่งการประกาศJAXB Binding อนุญาตให้มีการปรับแต่งการสร้าง Class JAXB ขึ้นกับ ข้อจำกัดเฉพาะของXML ในXML Schema เพื่อรวมเข้าJava-specific refinements เช่น class และชื่อของ package  mapping
  • อธิบายถึง source ของ XML Schema
  • การประกาศ การปรับแต่งข้อมูลbinding ข้างนอก ถูกส่งผ่านไปยัง JAXB Binding compiler
Java-to-Schema
คำอธิบายของJAXB กำหนดใน packageของ javax.xml.bind.annotations สามารถใช้การปรับแต่ง Java program element ไปเป็น XML schema mapping
  • ตัวอย่าง JAXB Annotations ที่ใช้กับ Java Package
Annotaion
Description and Default Setting
@XmlSchema
Maps a package to an XML target namespace.Default Settings:
@XmlSchema (
    xmlns = {},
    namespace = "",
    elementFormDefault = XmlNsForm.UNSET,
    attributeFormDefault = XmlNsForm.UNSET
)
@XmlAccessorType
Controls default serialization of fields and properties.Default Settings:
@XmlAccessorType (
    value = AccessType.PUBLIC_MEMBER
)
@XmlAccessorOrder
Controls the default ordering of properties and fields mapped to XML elements.
Default Settings:
@XmlAccessorOrder (
    value = AccessorOrder.UNDEFINED
)
@XmlSchemaType
Allows a customized mapping to an XML Schema built-in type.Default Settings:
@XmlSchemaType (
    namespace = "http://www.w3.org/2001/XMLSchema",
     type = DEFAULT.class
)
@XmlType
Maps a Java class to a schema type.Default Settings:
@XmlType (
    name = "##default",
    propOrder = {""},
    namespace = "##default",
    factoryClass = DEFAULT.class,
    factoryMethod = ""
)
@XmlRootElement
Associates a global element with the schema type to which the class is mapped.Default
Settings:
@XmlRootElement (
    name = "##default",
    namespace = "##default"
)
  
  • ตัวอย่าง JAXB Annotations ที่ใช้กับ Java enum Type
Annotaion
Description and Default Setting
@XmlEnum
Maps a Java type to an XML simple type.Default Settings:
@XmlEnum ( value = String.class )
@XmlEnumValue
Maps a Java type to an XML simple type.Default Settings:
None
@XmlType
Maps a Java class to a schema type.Default Settings:
@XmlType (
   name = "##default",
   propOrder = {""},
   namespace = "##default",
   factoryClass = DEFAULT.class,
   factoryMethod = ""
)
@XmlRootElement
Associates a global element with the schema type to which the class is mapped.Default  Settings:
@XmlRootElement (
   name = "##default",
   namespace = "##default"
)

นอกจากที่ยกตัวอย่างมา ยังมี JAXB Annotations ที่สามารถใช้ได้กับ Java Properties and Fields, Object Factories และ Adapters ได้อีกด้วย ดูเพิ่มเติมได้ที่ http://download.oracle.com/javaee/5/tutorial/doc/bnazy.html