【转】Java SE 6 新特性: XML API 与 Web 服务
转自:http://www.4ucode.com/Study/Topic/1102993
?
Java SE 6 做为一个开发平台,针对不同的应用开发需求,提供了各种各样的技术框架。XML 处理框架是 JDK 6 的重要组成部分之一。它为应用程序开发人员提供了一个统一的 XML 处理 API。这种框架结构有两个作用:一方面,开发人员透过这些框架,可以透明的替换不同厂商提供的 XML 处理服务;另一方面,服务提供商可以透过这些框架,将自己的产品插入到 JDK 中。这种框架一般被称为 Service Provider 机制。Java SE 6 的 XML 处理功能分为两个部分:XML 处理(JAXP)和 XML 绑定(JAXB)。在 XML 处理框架之上,Java SE 6 结合了注释(Annotation)技术,提供了强大的针对 Web 服务的支持。
本文首先介绍 Service Provider 机制及其在 XML 框架中的应用。然后介绍 Java SE 6 中 XML 框架的功能,包括 SAX,StAX,DOM 三种机制。最后介绍在此基础之上构建 Web 服务的技术。JAXB 和 Web 服务的开发关系紧密,故 JAXB 的介绍也放在 Web 服务部分介绍。本文内容基于 Java SE 6 SDK。
这样做的主要好处包括:
提供了供应商的中立性,应用代码与服务提供商完全独立,互不依赖。应用程序开发者针对?图 1?中?Application
?接口进行开发。这个接口将不同提供商的接口差异性屏蔽掉了。无论使用哪个厂商的服务,应用程序都是针对一个稳定、统一的接口开发,业务逻辑和第三方组件之间有很强的独立性。如果有需要,应用程序可以针对不同提供商重新部署。清单 1?显示某应用程序中的一段代码。
提供了扩展性,更多的服务可以加入开发平台;为了便于不同的开发商开发各自的产品,Java SE 平台同时为服务提供商设计了统一的接口。只要提供者满足这些接口定义(比如继承某个接口,或者扩展抽象类),服务提供者就能被添加到 Java SE 平台中来。以?图 2?给出的结构为例,服务提供者需要继承SAXParserFactory
、SAXParser
?等抽象类,同时将类?VendorSaxParserFactoryImpl
?的名字注册到 jaxp.properties 文件中,就可以被使用了。
兼顾了灵活性和效率。通过这种方式,一方面组件提供者和应用开发者开发时绑定到一个约定的接口上,另一方面载入具体哪个组件则是在运行时动态决定的。不同于 Web 服务等技术的完全动态绑定(通过运行时解析 WSDL 文件来决定调用的类型),也不是完全的编码时绑定,这种折衷的方式提供了松耦合、高扩展性,同时也保证了可接受的效率。
SAXParser 将 XML 文件当作流读入。当 parser 遇到 Element_A,就会产生一个事件,然后将该事件发送给处理类。SAX 框架的一大特点是对于节点的处理是上下文无关的。比如?图 3?中 SAXParser,允许注册一个处理类,这个处理类对于所有节点并不加以区分,对他们的处理过程都是一致的。一般包括 startElement 和 endElement 等动作。清单 2?给出了处理类的 startElement 动作的伪代码。
图 4?中的?Element_B
?具有?清单 3?这样的结构:
观察后可以发现 StAX 框架和 SAX 框架具有相似的地方。StAX 有?Event.isStartElement
?方法,SAX 有?DefaultHandler.startElement
?方法。StAX 有?Event.isCharacter
方法,SAX 有?DefaultHandler.character
?方法。实际上这两个框架处理 XML 文件的时候使用了相似的模型——将 XML 文件作为元素组成的流,而不同于 DOM 的树模型。解析 XML 文件时,应用程序调用?XMLEventReader
?的?nextEvent
?方法解析下一个元素(或者是解析同一个元素,根据解析的不同阶段,产生不同元素),StAX 就会通过?XMLEventReader
?产生一个事件。比如针对同一个元素,可能会产生?StartElement
?和?EndElement
?事件。形象的说?XMLEventReader
?就像是一根绳子,拽一下,解析一个元素,产生一个事件。于是这种技术也被称为”Pull Parser”技术。StAX 在处理 XML 文件时,产生的所有事件是通过一个?Iterator
(XMLEventReader
?继承了?Iterator
)返回的。应用程序通过这个?Iterator
?能知道某个解析事件的前后分别是什么。这类信息就是一个元素的上下文信息。
转换框架的输入输出对象的类型并不要求是一一对应的。比如,使用?DOMSource
?做为输入,可以使用?StreamResult
?作为输出。清单 5?是一段伪代码,用来显示 JDK 将不同javax.xml.transform.Source
?转换成不同?javax.xml.transform.Result
?子类型的过程:
得出的数据如下:
SAXStAXDOMXSLTjavax.xml.parsersjavax.xml.streamjavax.xml.parsersjavax.xml.transform javax.xml.stream.events javax.xml.transform.dom javax.xml.stream.util javax.xml.transform.sax javax.xml.transform.stax javax.xml.transform.stream使用 apt 编译 Hello.java,产生辅助文件:
发布 Hello Web service:
Java SE 6 SDK 内嵌了一个轻量级的 HTTP Server,方便开发者验证简单的 Web service 功能。通过以上三步,一个 Web service Endpoint 就部署完成,下面将开发一个调用 Hello 服务的客户端。
为 Web 服务的客户端产生存根文件:
开发,编译,运行 Web 服务客户程序。清单 10?给出了使用 Hello 服务的客户程序。
可以说在 Java SE 6 SDK 中,Web 服务的开发过程被大大简化了。原来开发中需要手工重复劳动产生的文件,可以使用工具自动生成。比如 WSDL 文件可以自动生成,和 WSDL 绑定的 Java 对象也自动生成,部署(本文仅指 JDK 提供的轻量 HTTP server 部署环境)也大大简化。这些全部归功于 JDK 6 中引入的一些新的 JSR 实现,即一些 API 和工具。表 2?给出了 JDK6 中为 Web 服务 API 提供支持的包。
Java API for XML-Based Web Services 2.0
javax.xml.wsjavax.xml.ws.handlerjavax.xml.ws.handler.soapjavax.xml.ws.httpjavax.xml.ws.soapjavax.xml.ws.spiJSR 222Java Architecture for XML Binding (JAXB) 2.0
javax.xml.bindjavax.xml.bind.annotationjavax.xml.bind.annotation.adaptersjavax.xml.bind.attachmentjavax.xml.bind.helpersjavax.xml.bind.utilJSR 181Web Services Metadata for the Java Platform
javax.jwsjavax.jws.soap除此之外 JDK 6 还提供了一些工具,包括 wsgen, wsimport 以及 Java 调用的轻量级 HTTP server。API 和工具联合提供了一个简单的 Web services IDE 开发环境,可以简化 Web 服务应用的开发。
xjc workcontactinfo.xsd
。将会在当前目录下生成一个 generated 子目录。运行命令?javac generated\*.java
,编译所有生成的 Java 文件。操作生成的 Java 对象。清单 12?给出了一个操作生成的 java 对象的例子。要注意,一定要先将 JAXB Reference Implementation jar 放到 classpath 中。回顾一下 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 包。
总结
比较前一个版本的 JDK,新版本对 XML 处理技术进行了扩展。包括新加入的 StAX 和 JAXB。基于这些新的 XML 数据处理技术,JDK 6 对 Web 服务的支持也得到了大大的增强。这些增强体现在引入了一些注释和 API,增加了更多的工具,可以自动化大部分开发和部署的工作。对于 XML 应用开发者来说,有更多更有力地技术可以选用。对于 Web 服务提供者来说,开发工具更为强大,开发流程更为简化,工作效率得到提高。而对于 Web 服务的使用者,更多的底层细节被屏蔽。可以说,新版 JDK 在对 XML 相关应用开发上的支持,较前一个版本有了很大提升。
参考资料
学习