`
kobe学java
  • 浏览: 250306 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

WebService CXF学习(进阶篇4):JAXB剖析

 
阅读更多

 前面几节我们讲解对象传递,但是通常情况下我们不直接传对象,因为直接传递对象安全性差,而且暴露了实体对象。所以我们选择传递XML文件,当然也可以传递JSON对象。这节我只针对传递XML,那么JAVA绑定成XML,服务端将XML解析成Java对象有什么工具可用吗,其实这样的工具多的是。这里我选择一个比较简单的JAXB工具来讲解一下。 
    JAXB(Java Architecture for XML Binding)提供了一个快速而方便的方式绑定XML Schemas和java,使java程序员能够很方便的在java应用程序中处理XML数据。JAXB提供了将XML文档解组为java内容树的方法,以及将java内容树重新编组回XML文档的方法。JAXB同样也提供了一种从java对象生成XML Schema的方式。 
    这里有几个重要的定义: 
    编组(Marshalling)是把内存中的数据转化到存储媒介上的过程。因此在 Java 和 XML 环境中,编组就是把一些 Java 对象转化成一个(或多个) XML 文档。在数据库环境中,则是把 Java 表示的数据存入数据库。显然,编组的秘密在于把 Java 实例中的面向对象结构转化成适用于 XML 的 扁平结构,或者 RDBMS 中的关系结构(使用 Java 技术转换到 OODBMS 实际上很简单)。工作原理如下图所示: 

 

    解组(Unmarshalling) 是把数据从存储媒介转换到内存中的过程--正好与编组相反。因此需要把 XML 文档解组到 Java VM 中。这里的复杂性不是在扁平数据中,因为这不是必需的,而在于从正确的数据到正确的 Java 代码变量的映射。如果映射是错误的,就不可能正确地访问数据。当然,如果再尝试重新编组还会造成更大的问题,并且问题传播得很快。工作原理如下图所示: 

 


    往返(Round-tripping)可能是最重要也最容易误解的数据绑定术语。往返用于描述从存储媒介到内存然后回到存储媒介的完整循 环。在 XML 和 Java 技术环境中,这就意味着从 XML 文档到 Java 实例变量,然后再回到 XML 文档。正确的往返要求,如果中间没有修改数据,XML 输入和 XML 输出应该是等同的。 
    下载地址:http://java.sun.com/developer/technicalArticles/WebServices/jaxb/ 
   
    我们还以例子来说明它的工作原理,直观点。 
    第一步,创建一个Customer对象 
   

Java代码   收藏代码
  1. @XmlRootElement(name="customer")  
  2. @XmlAccessorType(XmlAccessType.FIELD)  
  3. @XmlType(name = "")  
  4. public class Customer {  
  5.   
  6.     @XmlAttribute(required = true)  
  7.     protected String name;  
  8.     @XmlAttribute(required = true)  
  9.     protected int age;  
  10.   
  11.     /** 
  12.      * Gets the value of the name property. 
  13.      *  
  14.      * @return 
  15.      *     possible object is 
  16.      *     {@link String } 
  17.      *      
  18.      */  
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     /** 
  24.      * Sets the value of the name property. 
  25.      *  
  26.      * @param value 
  27.      *     allowed object is 
  28.      *     {@link String } 
  29.      *      
  30.      */  
  31.     public void setName(String value) {  
  32.         this.name = value;  
  33.     }  
  34.   
  35.     /** 
  36.      * Gets the value of the age property. 
  37.      *  
  38.      */  
  39.     public int getAge() {  
  40.         return age;  
  41.     }  
  42.   
  43.     /** 
  44.      * Sets the value of the age property. 
  45.      *  
  46.      */  
  47.     public void setAge(int value) {  
  48.         this.age = value;  
  49.     }  
  50.   
  51. }  
  52.   
  53.       



    第二步,创建一个测试类

Java代码   收藏代码
  1. public class SoapClient {  
  2.   
  3.     private final static String MODEL = "com.itdcl.model";  
  4.     public static void main(String[] args) throws ParserConfigurationException, JAXBException, TransformerException{  
  5.   
  6.           
  7.         ObjectFactory factory = new ObjectFactory();  
  8.         Customer customer = factory.createCustomer();  
  9.         customer.setAge(20);  
  10.         customer.setName("Josen");  
  11.   
  12.         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
  13.         dbf.setNamespaceAware(true);  
  14.         DocumentBuilder db = dbf.newDocumentBuilder();  
  15.         Document doc = db.newDocument();  
  16.   
  17.         JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);  
  18.         //Java对象转换成XML  
  19.                 Marshaller marshaller = jaxbContext.createMarshaller();  
  20.         marshaller.marshal(customer, doc);  
  21.           
  22.         DOMSource domSource = new DOMSource(doc);  
  23.         StringWriter writer = new StringWriter();  
  24.         StreamResult result = new StreamResult(writer);  
  25.         TransformerFactory tf = TransformerFactory.newInstance();  
  26.         Transformer transformer = tf.newTransformer();  
  27.         transformer.transform(domSource, result);  
  28.         String xmlString = writer.toString();  
  29.         System.out.println(xmlString);  
  30.         //XML转换成Java对象  
  31.         Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();  
  32.         StringReader reader = new StringReader(xmlString);  
  33.         Customer cus = (Customer)unmarshaller.unmarshal(reader);  
  34.         System.out.println("Age:"+cus.getAge());  
  35.         System.out.println("Name:"+cus.getName());  
  36.           
  37.           
  38.     }  
  39. }  



      第三步,运行一个测试类,看看效果如何。Java与XML之间转换如此简单 

      编组操作:利用上面生成的java文件执行编组操作。

Java代码   收藏代码
  1. JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);  
  2. //Java对象转换成XML  
  3.               Marshaller marshaller = jaxbContext.createMarshaller();  
  4. marshaller.marshal(customer, doc);  
  5.   
  6. DOMSource domSource = new DOMSource(doc);  
  7. StringWriter writer = new StringWriter();  
  8. StreamResult result = new StreamResult(writer);  
  9. TransformerFactory tf = TransformerFactory.newInstance();  
  10. Transformer transformer = tf.newTransformer();  
  11. transformer.transform(domSource, result);  
  12. String xmlString = writer.toString();  
  13. System.out.println(xmlString);  



     解组操作:通过xml文件执行解组操作。

   
Java代码   收藏代码
  1.               JAXBContext jaxbContext = JAXBContext.newInstance(MODEL);  
  2.               Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();  
  3. StringReader reader = new StringReader(xmlString);  
  4. Customer cus = (Customer)unmarshaller.unmarshal(reader);  
  5. System.out.println("Age:"+cus.getAge());  
  6. System.out.println("Name:"+cus.getName());  



    也可通过Ant配置来解组,如下:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <project default="xjc-compile" basedir=".">  
  3.     <property name="src.dir" location="src" />  
  4.     <property name="lib.dir" location="E:/cxf-lib" />  
  5.     <property name="xml-schema.dir" location="src/WEB-INF" />  
  6.     <property name="schema.name" value="cxfdemo.xsd" />  
  7.     <property name="package" value="com.itdcl.model" />  
  8.   
  9.     <path id="classpath">  
  10.         <fileset dir="${lib.dir}" includes="*.jar" />  
  11.     </path>  
  12.     <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask"  
  13.         classpathref="classpath" />  
  14.           
  15.     <target name="xjc-compile">  
  16.         <echo message="Build Jaxb Class from Schema" />  
  17.         <xjc schema="${xml-schema.dir}/${schema.name}"  
  18.             destdir="${src.dir}" package="${package}" >  
  19.             <produces dir="src/com/itdcl/model" includes="*" />  
  20.         </xjc>  
  21.     </target>  
  22. </project>  

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics