扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
从上一段关于 Web 服务的叙述中,我们能够发现开发和部署 Web 服务的过程中存在多次 Java 对象和 XML 文件转化的过程。比如开发和部署服务的时候,将一个 Web Service EndPoint 发布成为一个 WSDL,或者使用服务的时候,将一个 WSDL 文件转换成一组 Java 对象。所有的转换,都是通过工具自动完成的。这里存在一些问题,Java 对象的类型转换成 XML 元素是需要符合一定的标准,还是随意转换呢?如果按照标准转换,那么这个标准是什么样子的?比如 Java 中的 int 类型是应该变成
首先示范一个简单的例子,将根据一个 XML 文件的 schema,转换成 Java 对象。还是以 清单 6 中的数据文件为依据。构造一个 XML schema 文件,如 清单 11 所示。要运行这个例子,首先需要下载一个 JAXB Reference Implementation jar(下载请参见 参考资源),并将该 jar 文件加入到 classpath 中。
清单 11. 用于绑定的 workcontactinfo.xsd 文件
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="workcontactinfo" type="workcontactinfo" /> <xsd:complexType name="workcontactinfo"> <xsd:sequence> <xsd:element ref="Location" maxOccurs="1" minOccurs="1" /> <xsd:element ref="Postal" maxOccurs="1" minOccurs="1" /> <xsd:element ref="tel" maxOccurs="1" minOccurs="1" /> <xsd:element ref="Appellation" maxOccurs="1" minOccurs="1" /> </xsd:sequence> </xsd:complexType> <xsd:element name="tel" type="tel" /> <xsd:complexType name="tel"> <xsd:sequence> <xsd:element ref="fix" maxOccurs="1" minOccurs="1" /> <xsd:element ref="mobile" maxOccurs="1" minOccurs="1" /> </xsd:sequence> </xsd:complexType> <xsd:element name="Location" type="xsd:string" /> <xsd:element name="Postal" type="xsd:string" /> <xsd:element name="Appellation" type="xsd:string" /> <xsd:element name="fix" type="xsd:string" /> <xsd:element name="mobile" type="xsd:string" /> </xsd:schema> |
运行命令 xjc workcontactinfo.xsd。将会在当前目录下生成一个 generated 子目录。
运行命令 javac generated\*.java,编译所有生成的 Java 文件。
操作生成的 Java 对象。清单 12 给出了一个操作生成的 java 对象的例子。要注意,一定要先将 JAXB Reference Implementation jar 放到 classpath 中。
清单 12. 调用生成的 Java 对象
import generated.*; import java.io.FileOutputStream; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class JAXBTest { public static void main(String[] args) { try { JAXBContext jContext = JAXBContext.newInstance("generated"); ObjectFactory factory = new ObjectFactory(); Workcontactinfo contactinfo = (Workcontactinfo) (factory .createWorkcontactinfo()); contactinfo.setAppellation("Mr. Wang"); contactinfo.setLocation("Shanghai-shuion-333"); contactinfo.setPostal("200020"); Tel tel = (Tel) (factory.createTel()); tel.setFix("123456"); tel.setMobile("1376666666"); contactinfo.setTel(tel); Marshaller marshaller = jContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); marshaller.marshal(contactinfo, new FileOutputStream( "workcontactinfo1.xml")); System.out.println("java tree converted into xml & filed"); } catch (Exception e) { e.printStackTrace(); } } } |
清单 13. XML 数据文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <workcontactinfo> <Location>Shanghai-shuion-333</Location> <Postal>200020</Postal> <tel> <fix>123456</fix> <mobile>1376666666</mobile> </tel> <Appellation>Mr. Wang</Appellation> </workcontactinfo> |
回顾一下 Web 服务的 WSDL 文件,如 图 5 所示,是一个符合 W3C XMLSchema 规范的 schema 文件,以及整个过程中生成的 Java 类,我们应该能更好的理解 Web 服务开发,部署,使用的全过程。首先 JDK 6 提供的工具 apt 根据 Web Service EndPoint 中相关的注释生成一些与 WSDL schema 绑定的 Java 类。察看这些类可以发现,它们与 JAXB 例子中 generated 目录下生成的 Java 文件十分相似。接着通过 HTTP 服务将这个 WSDL schema 文件发布出来。然后通过 wsimport 工具,生成一个 Web 服务的客户运行时代理,相当于 清单 12 的功能。最终 Web 服务的用户程序同运行时代理交互,该代理生成并传递形式如 清单 13 的 XML 数据文件。图 10 结合 表 2 给出了 Web 服务开发到使用整个周期的工作流和涉及到的 JDK 包。
图 10. Web 服务开发部署流程中 XML 技术的应用
总结
比较前一个版本的 JDK,新版本对 XML 处理技术进行了扩展。包括新加入的 StAX 和 JAXB。基于这些新的 XML 数据处理技术,JDK 6 对 Web 服务的支持也得到了大大的增强。这些增强体现在引入了一些注释和 API,增加了更多的工具,可以自动化大部分开发和部署的工作。对于 XML 应用开发者来说,有更多更有力地技术可以选用。对于 Web 服务提供者来说,开发工具更为强大,开发流程更为简化,工作效率得到提高。而对于 Web 服务的使用者,更多的底层细节被屏蔽。可以说,新版 JDK 在对 XML 相关应用开发上的支持,较前一个版本有了很大提升。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者