วันพฤหัสบดีที่ 15 กันยายน พ.ศ. 2554

MouseEvent VS MouseEvent2 !!!

จั่วหัวอาจจะงงเล็กน้อย...สำหรับบทความนี้จะกล่าวถึงการ config ค่าเพื่อให้ Bean ของเราแสดงหรือซ่อน Properties,Event,Method ตามที่เราต้องการได้ครับ
สำหรับความแตกต่างของ MouseEvent และ MouseEvent2 นั้นคือ MouseEvent2 จะมีไฟล์ชื่อ MySource2BeanInfo และ MyReciever2BeanInfo อยู่            สำหรับไฟล์ MySource2BeanInfo  นี้เมื่อเปิดเข้าไปดู จะพบ Method คือ PropertyDescriptor, EventSetDescriptor, MethodDescriptor ดังภาพ โดยเราจะเห็นว่า PropertyDescriptor, MethodDescriptor นั้นมีการ return array ว่างๆกลับไปซึ่งหมายถึง เราไม่ต้องการแสดง Property และ Method ของ MySource2
ส่วน EventSetDescriptor นั้น จะเห็นว่า array ที่ return กลับไปนั้น มีค่าอยู่ เป็น Event ที่เราต้องการแสดง
โดยชื่อของ Event จะอยู่ใน  String mnames[] = {….,….,….} (ตรงนี้สามารถกำหนดได้ว่าจะให้มี Event ใดบ้าง)



                ถ้าหากเราลบคำสั่งต่างๆ ใน EventSetDescriptor ซึ่งจะทำให้ EventSetDescriptor นั้นเหมือนกับ PropertyDescriptor, MethodDescriptor คือ ไม่มีการแสดง Event ของ MySource2 ออกมาเลย

*หมายเหตุ เราสามารถแก้ไข Properties,Event,Method ของ Myreciever ได้ตามวิธีด้านบนเช่นกัน

JAXB !!!

JAXB คืออะไร?
JAXB (The Java Architecture for XML Binding) เป็นส่วนหนึ่งของ JAX API ใน Java EE เพื่อใช้ในการแปลงไปมาระหว่าง XML Schema กับ โครงสร้างข้อมูลในภาษา Java และ แปลงไปมาระหว่าง XML Document กับ Object ในภาษา Java โดยปัจจุบัน JAXB อยู่ที่ Version 2.0

ทำไมจึงต้องใช้ JAXB?
การใช้งาน XML file เพื่อที่จะทำงานหรือเขียนโปรแกรมร่วมกับภาษา Java นั้นเป็นเรื่องยาก ถ้าจะต้องเขียนโปรแกรมเพื่อดูแลจัดการกับ XMLfile เหล่านั้นหรือทำการแปลง XML file เหล่านั้นให้เป็นโครงสร้างในภาษา Java   JAXB จึงเป็นทางเลือกหนึ่งในการที่จะดูแลจัดการกับ XML file เหล่านั้นเพื่อมาทำงานร่วมกับภาษา Java ได้อย่างง่ายดาย โดยการใช้ JAXB ทำให้สามารถทำงานกับโครงสร้างและเอกสาร XML ได้ โดยไม่ต้องรู้ถึงโครงสร้างและกระบวนการทำงานภายในของ XML file  นอกจากนี้ JAXB ยังมีกระบวนการในการตรวจสอบ (Validation) ซึ่งเป็นกระบวนการที่สำคัญในการทำงานร่วมกับ XML file และทำให้มั่นใจได้มากขึ้นในกระบวนการแปลงไปมาระหว่าง XML กับ Java
JAXB Architecture


JAXB Component ประกอบไปด้วย
             Schema Compiler เป็นกระบวนการที่แปลง Schema ที่ใช้อธิบาย XML หรือข้อมูลของ XML ไปเป็น Java
             Schema Generator ทำการเปลี่ยนข้อมูลจาก Java ให้ไปเป็น Schema
             Binding runtime framework เป็นชุดคำสั่งที่ใช้ในการจัดการกระบวนการ unmarshalling และ marshalling

JAXB Binding Process


- Generate classes : XML Schema จะเป็น input ของกระบวนการในส่วนของ JAXB binding compiler เพื่อที่จะสร้าง JAXB classes โดยมีโครงสร้างตาม Schema ดังกล่าว
- Compile classes : ทุก class ที่ถูกสร้างขึ้น ,ไฟล์ต่างๆ รวมถึง source code ต่างๆ จะถูกนำมา Compile
- Unmarshal : เอกสาร XML ที่ถูกสร้างขึ้นโดยอ้างอิงจากข้อกำหนดใน Schema จะถูกนำมาทำการ unmarshal โดย JAXB Binding framework นอกจากนี้ JAXB ยังสนับสนุนในการทำ unmarshall XML data จากแหล่งข้อมูลอื่นๆนอกจากไฟล์หรือเอกสารต่างๆ เช่น DOM nodes , String buffer , SAX sources เป็นต้น
- Generate content tree : ในการทำ unmarshalling จะมีกระบวนการในการสร้างโครงสร้างต้นไม้สำหรับ object ข้อมูล โดย object เหล่านี้จะถูกสร้างขึ้นจาก JAXB classes ที่กล่าวมาในขั้นตอนที่แล้ว
- Validate (optional) : ในกระบวนการ unmarshalling  ยังสามารถตรวจสอบความถูกต้องของเอกสาร XML ก่อนที่จะนำไปสร้างเป็น content ในขั้นตอนต่อไป โดยหากเรามีการแก้ไข content tree ในขั้นถัดไป เราก็สามารถใช้กระบวนการตรวจสอบดูว่ามีความถูกต้องหรือไม่ ก่อนที่จะแปลง content tree กลับเป็นเอกสาร XML
- Process content : Application ทางฝั่งของ Client สามารถที่จะแก้ไขข้อมูลXML ที่ถูกจัดอยู่ในรูปแบบของโครงสร้างต้นไม้ได้
- Marshal : โครงสร้างต้นไม้ที่ผ่านกระบวนการมานั้นจะได้เป็น เอกสารXMLซึ่งเนื้อหาของเอกสาร จะถูกตรวจสอบก่อนที่จะทำการแปลง


ตัวอย่างประเภทข้อมูลในการแปลง Schema-to-Java
XML Schema Type
Java Data Type
xsd:string
java.lang.String
xsd:integer
java.math.BigInteger
xsd:int
int
xsd:double
double
xsd:time
javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType
java.lang.Object  /  java.lang.String

ตัวอย่างประเภทข้อมูลในการแปลง Java-to-Schema
Java Class
XML Data Type
java.lang.String / java.net.URI
xs:string
java.math.BigInteger
xs:integer
java.util.Date / java.util.Calendar
xs:dateTime
java.lang.Object
xs:anyType
javax.xml.datatype.Duration
xs:duration
java.awt.Image
xs:base64Binary

วันพฤหัสบดีที่ 8 กันยายน พ.ศ. 2554

การใช้งาน JAXB ใน NetBean ง่ายแค่ปลายนิ้ว

ก่อนอื่นสิ่งที่เราต้องมีคือ XML Schema หรือ WSDL ก็ได้ (ในตัวอย่างใช้ XML Schema)
อาจจะสงสัยนะครับว่า XML Schema คืออะไร ลองศึกษาได้จากลิงค์นี้เลยครับ

XML Schema ที่ใช้ในตัวอย่างครับ
โหลดได้จาก http://www.mediafire.com/?v4x2xneq9zjky3u

1. ทำการสร้าง Java Application ใน NetBean ขึ้นมา

2. คลิกที่เมนู File > New… เลือกที่ XML และ JAVA Binding ตามลำดับ คลิกที่ ปุ่ม Next
3. ตั้งชื่อการ Binding และ Browse ไฟล์ไปที่ XML Schema แล้วคลิกที่ปุ่ม Finish

4. ถ้าการสร้าง Binding สำเร็จ จะได้ไฟล์ที่ถูกสร้างจาก XML Schema ต่างๆ ดังภาพ

การสร้าง XML (Marshalling)
1. ใน Main Program เราจะสร้าง Object ของclass Area ซึ่งเป็นหนึ่งใน class ที่ถูกสร้างขึ้นจาก XML Schema โดยใช้ ObjectFactory

      //สร้าง Area จาก ObjectFactory
      Area a =
new ObjectFactory().createArea();
      //
ตั้งค่าให้ object Area ที่สร้างมา
      a.setAreaSeq(Integer.valueOf(1));
      a.setAreaName(String.valueOf("TestArea"));
      a.setAreaLat(Double.valueOf(133.123123));
      a.setAreaLng(Double.valueOf(133.123123));
2. ใน Main Program พิมพ์ jaxbm แล้วกดปุ่ม Tab บน Keyboard จะได้โค้ดโปรแกรมดังภาพ
try {
    javax.xml.bind.JAXBContext jaxbCtx =              javax.xml.bind.JAXBContext.newInstance
            (a.getClass().getPackage().getName());
    javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller();
    marshaller.setProperty
      (javax.xml.bind.Marshaller.JAXB_ENCODING,
"UTF-8"); //NOI18N
    marshaller.setProperty
      (javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    marshaller.marshal(a, System.out);
} catch (javax.xml.bind.JAXBException ex) {
    // XXXTODO Handle exception
    java.util.logging.Logger.getLogger("global")
      .log(java.util.logging.Level.SEVERE,
null, ex); //NOI18N
}

3. ทดลอง Run โปรแกรม จะพบ Error ดังภาพ จะเกิดจาก JAXB ไม่พบ @XmlRootElement ใน class Area
4. ทำการแก้ Error โดยการใส่ Annotation @XmlRootElement() ใน class Area
5. ทำการ Run โปรแกรมอีกครั้ง จะได้ผลดังภาพ ซึ่งเป็น XML ที่ได้จาก class Area
6. ในกรณีที่อยากได้ผลลัพธ์เป็นไฟล์ XML เราจะเปลี่ยนโค้ดดังนี้

      marshaller.marshal(a, new FileOutputStream("ที่อยู่ของไลฟ์ XML ที่เราจะเขียน"));

การอ่าน XML (Unmarshalling)
1. สร้างไฟล์ XML ชื่อ Area เก็บไว้ใน C:\
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <ns2:area xmlns:ns2="http://webservice.ar/">
            <Area_Seq>1</Area_Seq>
            <Area_Name>เทคโนลาดกระบัง</Area_Name>
            <Area_Lat>133.123123</Area_Lat>
            <Area_Lng>100.123123</Area_Lng>
      </ns2:area>

2. ใน Main Program เราจะสร้าง Object ของclass Area ซึ่งเป็นหนึ่งใน class ที่ถูกสร้างขึ้นจาก XML Schema โดยใช้ ObjectFactory
      //สร้าง Area จาก ObjectFactory
      Area a =
new ObjectFactory().createArea();

3. ใน Main Program พิมพ์ jaxbu แล้วกดปุ่ม Tab บน Keyboard จะได้โค้ดโปรแกรมดังภาพ
try {
    javax.xml.bind.JAXBContext jaxbCtx =        javax.xml.bind.JAXBContext.newInstance
           
(a.getClass().getPackage().getName());
    javax.xml.bind.Unmarshaller unmarshaller =              jaxbCtx.createUnmarshaller();
    a = (Area) unmarshaller.unmarshal
      (
new java.io.File("C://Area.xml")); //NOI18N
} catch (javax.xml.bind.JAXBException ex) {
    // XXXTODO Handle exception
      java.util.logging.Logger.getLogger("global")
            .log(java.util.logging.Level.SEVERE,
null, ex); //NOI18N
}

4. แก้ไข "File path" ไปเป็น ที่อยู่ไฟล์ที่ต้องการ ในตัวอย่างคือ "C://Area.xml"
5. เพิ่มโค้ดในส่วนของการแสดงผลลัพธ์จากการอ่านไฟล์
      //แสดงผลการอ่านไฟล์ ออกทากหน้าจอ
      System.out.println("Area_Seq : "+a.getAreaSeq());
      System.out.println("Area_Name : "+a.getAreaName());
      System.out.println("Area_Lat : "+a.getAreaLat());
      System.out.println("Area_Lng : "+a.getAreaLng());


6. ทำการ Run Program จะได้ผลลัพธ์ดังภาพ

หวังว่าทุกคนคงจะใช้งาน JAXB ใน NetBean เป็นแล้วนะครับหลังจากได้ศึกษาจาก Blog นี้ ^^