首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-07-01 
WebService CXF学习(进阶篇4):JAXB剖析?前面几节我们讲解对象传递,但是通常情况下我们不直接传对象,因为直

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 实际上很简单)。工作原理如下图所示:?

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

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

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


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

Java代码??WebService CXF学习(进阶篇四):JAXB剖析
  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代码??WebService CXF学习(进阶篇四):JAXB剖析
  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代码??WebService CXF学习(进阶篇四):JAXB剖析
  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代码??WebService CXF学习(进阶篇四):JAXB剖析
  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代码??WebService CXF学习(进阶篇四):JAXB剖析
  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> ?

?

热点排行