Java技术社团大约一年以前就在不懈地努力,想通过Java Community Process开发出用于Web服务的一组全面的标准Java API。有一些活动仍在进行中,而其他活动则已经完成或接近完成。在本文中,我将首次给出用于Web服务的所有Java API的一个快速概览,然后再详细介绍三个用于Web服务的核心Java API:用于XML消息传递的Java API(Java API for XML Messaging,JAXM)、用于远程过程调用的Java API(Java API for Remote Procedure Call,JAX-RPC)和用于XML注册的Java API(Java API for XML Registry,JAXR)。Java API用于Web服务。中国IT动力uMHNXr1
首先让我们来研究Web服务体系结构的核心构件。你起码需要一种标准的方式来描述Web服务。另外还必须有一个注册机制,通过该机制,服务提供者可以发布服务,然后服务使用者可以发现服务。然后还必须有一种标准的方式,用于通过基于XML的消息的交换来调用服务。最后,为了在互联网上完成业务事务,还必须有一种标准的电子业务框架,用于定义业务合作的语义。中国IT动力uMHNXr1
下面的图1演示了Web服务的这些核心构件以及它们相应的标准。首先,SOAP(简单对象访问协议)或ebXML消息传递服务用于服务调用,统一描述、发现和集成(Universal Description, Discovery and Integration,UDDI)或ebXML注册和存储用于服务发布和发现,而WSDL(Web服务描述语言)用于基本服务描述。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图1:Web服务标准中国IT动力uMHNXr1
现在,让我们快速复习一下用于Web服务的这些构件的Java API。首先,对于服务描述有JSR 110,即用于WSDL的Java API。该API将让你创建、处理和查询WSDL文档。但是,该API一般应该由工具提供商来使用。一个更重要的JSR是JAX-RPC,这是一个特别从开发者的角度出发的API。JAX-RPC定义如何将WSDL文档映射到相应的Java API表示,反之亦然。JAXR用于服务注册和发现及管理。而对于服务调用,JAXM和JAX-RPC将成为重要的工具。下表列出了与Web服务相关的所有Java API。中国IT动力uMHNXr1
用于Web 服务的Java API中国IT动力uMHNXr1 |
对于电子业务框架,带有ebXML消息传递服务描述的JAXM让你利用较高级别的消息传输语义执行服务调用,主要是在安全和可靠领域。JAXR还支持ebXML reg/rep作为一个基础注册提供者。还有一个新的JSR,即JSR-157,它的目标是为创建、操纵和处理ebXML CPP/CPA文档定义一个标准的Java API。中国IT动力uMHNXr1
还有其他两个非常重要的JSR活动,它们的目标是在Java 2 Platform, Enterprise Edition (J2EE)上定义一个公共的Web服务框架:JSR 109(即企业Web服务)和JSR 151(即J2EE 1.4——下一版本的J2EE体现结构)。JSR 109和J2EE 1.4体系结构将采用JAXM、JAX-RPC和JAXR作为核心结构组件,以建立J2EE作为Web服务的开发和部署平台。 中国IT动力uMHNXr1
还有用于XML文档管理的Java API,其中JAXP用于XML文档的解析和转换,而JAXB用于XML数据绑定。Java技术社团还努力定义用于基于XML的安全模式的API,这些API包括用于XML数字签名的JSR 105、用于XML加密的JSR 106、用于信任服务的JSR 104和用于定义安全断言标记语言(Security Assertions Markup Language,SAML)的Java API的JSR 155。中国IT动力uMHNXr1
图2显示了J2EE体系结构如何被用作Web服务开发和部署的平台,以及哪些Java API对于实现Web服务是可用的。服务客户端(不管是浏览器、蜂窝电话,还是其他应用)通过用于Web服务的Java API交换XML数据(或者更可能是SOAP消息),从而与基于J2EE技术的服务进行通信。服务实现可以是J2EE平台业务组件的形式,例如servlets或EJB beans。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图2:基于J2EE体系结构的Web服务体系结构中国IT动力uMHNXr1
JAXM 中国IT动力uMHNXr1
JAXM为发送和接收SOAP消息提供一个标准的Java API。消息结构和编码规则是基于SOAP 1.1和SOAP with Attachment (SOAPATTACH)规范。JAXM还支持一个框架,高级的描述可以插入到该框架中,以支持基本SOAP上的扩展语义。这些描述的例子有ebXML消息服务描述和SOAP RP描述。中国IT动力uMHNXr1
那么为什么使用JAXM呢?就像任何其他Java技术一样,JAXM提供一个标准的Java API,所以应用可以移植。JAXM还提供一个灵活的体系结构,在这种结构中,提供商可以在维护你的应用的可移植性的同时参加它们的实现。例如,我们后面将会讲到,提供商可以实现带有增加值特性(比如更高的可靠性或智能路由)的JAXM提供者。中国IT动力uMHNXr1
图3显示了JAXM(和就这点而论的JAX-RPC)的相互操作模型。前面已经提到过,JAXM为发送和接收SOAP消息提供一个标准的Java API。只要基础XML和传输协议是基于HTTP上的SOAP、JAXM或JAX-RPC,应用就应该可以与它们的对等体相互操作,而不管这些对等体是编写为通过非-JAXM API或者是以Java以外的编程语言编写的这一事实。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图3:JAXM相互操作模型中国IT动力uMHNXr1
JAXM结构角色中国IT动力uMHNXr1
在JAXM运行时环境中,可以有两个结构角色。一个是JAXM消息提供者(或者叫做JAXM提供者),另一个是JAXM客户。而JAXM客户又可以是两种类型中的一种——一种使用JAXM提供者,另一种不使用JAXM提供者。(顺便说一下,我们使用术语“JAXM客户”是指JAXM API的一个用户,而不是从传统客户和服务器通信模型的角度出发。例如,JAXM客户可以提供可被其他客户调用的SOAP服务,或者该服务将从远程SOAP服务调用一个服务。所以把“JAXM客户”叫做“JAXM应用”更合适。但是既然JAXM规范使用术语“JAXM客户”,我们也就使用它吧)。不使用JAXM提供者的JAXM客户叫做独立的JAXM客户。中国IT动力uMHNXr1
JAXM消息提供者在后台以JAXM客户的名义工作,提供消息路由和可靠消息传递等功能,例如,通过分配消息标识符或永久地在内部保留着消息。事实上,不同的提供者提供的功能变化很大。JAXM提供者的服务是通信结构的组成部分,而不是特定于某个应用。因此,这些服务对JAXM客户是完全透明的,JAXM客户不了解提供者,除非建立了一个到该提供者的连接。中国IT动力uMHNXr1
正如前面所提到的,有两种类型的JAXM客户——一种使用JAXM消息提供者,另一种不使用JAXM消息提供者。既然解释不使用JAXM消息提供者的JAXM客户比较容易,那么我们就先来讨论这种JAXM客户。不使用JAXM消息提供者的JAXM客户是一个独立的Java 2 Platform, Standard Edition (J2SE)应用,因为该客户应用有所有需要的Java类在它的地址空间中。但是独立的JAXM客户只可以在点到点的操作模式中工作。另外,独立的JAXM客户只可以发送消息到特定的目的。如果基础传输协议是HTTP,那么该目的可以表示为URL。独立的JAXM客户也只在同步模式中工作。也就是说,它基本上以请求-响应交互模型工作,因而不能以异步模式接收消息。中国IT动力uMHNXr1
现在我们来讨论使用JAXM消息提供者的JAXM客户类型。在这种情况下,JAXM客户维持着一个与JAXM消息提供者的连接,并且该客户发送或接收的所有消息都通过该JAXM消息提供者。在大多数Web消息传递场景中,JAXM客户将使用一个JAXM消息提供者。在这种场景中,JAXM客户被部署到一个容器中,这意味着它既可以同步发送消息,也可以异步发送消息。容器可以是J2EE Web容器或者是EJB容器。如果JAXM客户被部署在EJB容器中,那么很可能该JAXM客户是消息驱动Bean的形式;如果它被部署在Web容器中,它就扩展JAXMServlet类。中国IT动力uMHNXr1
JAXM消息传递描述中国IT动力uMHNXr1
JAXM的一个重要特性就是支持高级别的消息传递描述。通过为指定高级别的语义(比如安全性、可靠性、事务和管理)而规定SOAP头的一个特定用法,消息传递描述运行在基本SOAP上。 SOAP的基本形式不支持基于寻址或基于消息传递的会话方案,也就是说,基本的SOAP消息没有任何用于寻址信息(比如发送者、接收者、消息ID和相关信息)的字段。描述在这一领域也有帮助。JAXM可以支持很多工业标准消息描述,一个主要的例子是ebXML消息服务描述。中国IT动力uMHNXr1
JAXM包中国IT动力uMHNXr1
图4显示了JAXM应用及其使用的基础Java应用包的一个分层视图。JAXM应用可以使用三种不同层次的API。在最顶层有由高级别描述(比如ebXML消息传递服务描述)暴露的编程API。JAXM应用也可以使用由JAXM消息传递包暴露的API或由JAXM SOAP包暴露的API。这些三层API集合中的每一层都提供不同的功能:描述API用于访问和处理特定于描述的SOAP头、JAXM消息传递API用于提供消息传递(例如,与JAXM消息提供者通信)的一个抽象和SOAP API用于创建及处理SOAP消息头与消息体结构。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图4:JAXM分层视图中国IT动力uMHNXr1
JAXM部署中国IT动力uMHNXr1
JAXM应用可以分别打包为Web应用或J2EE平台应用,及部署到Servlet 2.2和/或J2EE 1.3容器中。可以预期到,J2EE规范(J2EE 1.4)的未来版本将会包含JAXM特定的部署信息。独立的JAXM应用只实现一种请求-响应形式的消息传递,这种应用可以被认为是J2SE应用,并且不会为这样的应用引入新的部署要求。中国IT动力uMHNXr1
JAX-RPC 中国IT动力uMHNXr1
JAX-RPC是JAXM、JAX-RPC和JAXR这三者之一。JAX-RPC处理SOAP消息传递的RPC部分。现在我们来讨论JAX-RPC的范围。首先,它定义Java API和XML数据类型映射是如何完成的。例如,当SOAP客户调用SOAP服务提供者的一个方法时,方法的参数必须从Java对象映射到相应的XML元素。而当SOAP服务提供者接收到一个SOAP RPC请求消息时,则必须从XML元素映射到相应的Java对象。JAX-RPC也定义WSDL文档及其元素是如何映射到Java API表示的。例如,WSDL文档的portType元素被映射到服务定义接口,这是定义在WSDL文档中的服务的抽象部分的Java表示。JAX-RPC也定义运行时API,其中包含stub接口、动态代理、动态调用,以及最终的编组和解组。Stub类一般由工具产生,并且必须实现Stub java接口。动态代理由JAX-RPC实现——JAX-RPC运行时产生,并且它是服务定义接口的一个实现。动态调用允许客户在运行时设置目标地址和属性(比如用户名和密码)。中国IT动力uMHNXr1
JAX-RPC:XML数据类型到Java API的映射中国IT动力uMHNXr1
可以映射到Java API类型的XML数据类型包括简单类型和复杂类型。简单类型包含W3C XML 方案中定义的内置的原始类型。例如,字符串数据类型被映射到java.lang.String类,而dateTime数据类型被映射到java.util.Calendar类。JAX-RPC规范地址指出的其他简单类型包括数组和枚举型。复杂类型的一个例子是结构数据类型。结构类型被映射到具有相应getter和setter方法的JavaBeans组件。下面我们来看两个例子。中国IT动力uMHNXr1
下面的例子显示了枚举数据类型是如何映射到相应的Java类的。中国IT动力uMHNXr1
下载或使用该代码,你就同意这些许可条款。中国IT动力uMHNXr1
<!-- XML data type definition --------> <element name="EyeColor" type="tns:EyeColor"/> <simpleType name="EyeColor"> <restriction base="xsd:string"> <enumeration value="green"/> <enumeration value="blue"/> </restriction> </simpleType> // Java Representation of a simpleType "EyeColor" public class EyeColor implements java.io.Serializable { // Constructor protected EyeColor(String value) { ... } public static final String _green = "green"; public static final String _blue = "blue"; public static final EyeColor green = new EyeColor(_green); public static final EyeColor blue = new EyeColor(_blue); public String getValue() { ... } public static EyeColor fromValue(String value) throws java.lang.IllegalStateException { ... } public boolean equals(Object obj) { ... } public int hashCode() { ... } }中国IT动力uMHNXr1
下面的例子显示XML结构数据类型如何以Java类来表示。正如前面所提到的,XML结构类型可以由JavaBean类来表示,该类具有针对结构的每个成员的getter和setter方法。中国IT动力uMHNXr1
<!-- XML data type definition --------> <element name="Book"/> <complexType> <all> <element name="author" type="xsd:string"/> <element name="preface" type="xsd:string"/> <element name="price" type="xsd:float"/> <all> </complexType> // Java Representation of a structure type "Book" public class Book implements java.io.Serializable { // ... public String getAuthor() { ... } public void setAuthor(String author) { ... } public String getPreface() { ... } public void setPreface(String preface) { ... } public float getPrice() { ... } public void setPrice(float price) { ... } }中国IT动力uMHNXr1
JAX-RPC:WSDL到Java API的映射中国IT动力uMHNXr1
JAX-RPC处理的另一个重要领域是描述WSDL文档及其元素是如何映射到相应的Java表示的。JAX-RPC规范表明,每个WSDL文档应该映射到独立的Java包,而WSDL文档的抽象元素——portType、operation和message元素——应该表示为Java接口类型及其方法。JAX-RPC规范还定义WSDL文档的具体绑定部分——绑定、端口、服务元素——是如何映射到正确的Java API表示的。因此,JAX-RPC规范定义了一组规则,关于如何将WSDL文档的抽象部分表示为相应的Java API表示。首先,portType元素映射到一个Java接口类型,portType元素是operation元素的集合。该Java接口类型被作为服务定义接口来调用。该服务定义接口扩展ava.rmi.Remote。operation元素被映射到服务定义接口的一个方法,而message元素被映射到该方法的参数。因此,让我们来看一个例子。中国IT动力uMHNXr1
<!----- Abstract part of a WSDL Document ------------------> <message name="GetLastTradePriceInput"> <part name="tickerSymbol" type="xsd:string"/> </message> <message name="GetLastTradePriceOutput"? <part name="result" type="xsd:float"/> </message> <portType name="StockQuoteProvider"> <operation name="GetLastTradePrice" parameterOrder="tickerSymbol"> <input message="tns:GetLastTradePriceInput"/> <output message="tns:GetLastTradePriceOutput"/> </operation> </portType> //----------- Service Definition Interface ---------------------// public interface StockQuoteProvider extends java.rmi.Remote { float getLastTradePrice(String tickerSymbol) throws java.rmi.RemoteException; }中国IT动力uMHNXr1
在上面的例子中,第一部分包含例子WSDL文档的抽象部分,该例子文档定义了portType、operation和message元素。(在WSDL文档中,portType、operation和message元素定义了服务的抽象部分。portType是operation的集合。Operation是一个动作,在该动作中,进行输入/输出消息的交换以完成动作)。例子的底部是Java API表示。在该例子中,portType的名称StockQuoteProvider以红色高亮显示,并被用作服务定义接口的名称。Operation的名称GetLastTradePrice以兰色高亮显示,并被转换为相同名称的方法。请注意,服务定义接口扩展java.rmi.Remote类型,并且每个方法都抛出java.rmi.RemoteException。另外,服务定义接口只表示WSDL文档的抽象部分,也就是说,它不涉及服务是如何绑定到特定的XML或传输协议的。中国IT动力uMHNXr1
WSDL文档中的service元素表示一个端口总集,其中每个端口都定义了特定的绑定。也就是说,有了binding和port元素,service元素将portType元素的抽象定义与具体的XML和传输协议及它们的端点地址绑定在一起;例如,HTTP上的SOAP作为具体的XML和传输协议,而特定的URL作为端点地址。中国IT动力uMHNXr1
在JAX-RPC之下,service元素被映射到javax.xml.rpc.Service接口类型。javax.xml.rpc.Service类充当下面这些东西的工厂:中国IT动力uMHNXr1
- 服务端口的动态代理。
- 类型javax.xml.rpc.Call的实例,该类型用于服务端口上的远程操作的动态调用。
- 产生的stub类的实例。
因此,前一个例子只处理WSDL文档的抽象部分,与此相反,WSDL文档的service元素被转换为javax.xml.rpc.Service类,该类指定了该服务将如何被调用。中国IT动力uMHNXr1
下一代码段显示了例子WSDL文档的具体绑定部分。在该例子中,叫做StockQuotePortType的portType被绑定到SOAP,SOAP可以支持文档样式或RPC样式。文档样式是可以选择的。最后,该服务通过一个通信端点被暴露,该端点由一个为特定通信协议指定端点地址的port元素来表示。在该例子中,端点碰巧是URL形式,即http:///stockquote,因为用于传输SOAP消息的传输协议是HTTP。如果使用的传输协议是SMTP,那么端点将是邮件地址的形式。中国IT动力uMHNXr1
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas./soap/http"/> <operation name="GetLastTradePrice"> <soap:operation soapAction="http:///GetLastTradePrice"/> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="StockQuoteService"> <documentation>My first service</documentation> <port name="StockQuotePort" binding="tns:StockQuoteBinding"> <soap:address location="http:///stockquote"/> </port> </service>中国IT动力uMHNXr1
下一代码段是由JAX-RPC规范定义的javax.xml.rpc.Service Java接口类型。JAX-RPC 1.0实现是必需的,以提供给该接口一个实现类。也就是说,由平台提供商负责实现该接口。该实现类是必需的,以支持动态代理和javax.xml.rpc.Call对象的创建。getPort方法为指定的服务端口返回动态代理。服务客户使用该动态代理来调用目标服务端口上的操作。proxyInterface指定所创建的动态代理支持的服务定义接口。中国IT动力uMHNXr1
package javax.xml.rpc; public interface Service { public java.rmi.Remote getPort(QName portName, Class proxyInterface) throws JAXRPCException; public Call createCall(QName portName) throws JAXRPCException; public Call createCall(QName portName, String operationName) throws JAXRPCException; public Call createCall() throws JAXRPCException; public java.net.URL getWSDLDocumentLocation(); public QName getServiceName(); public java.util.Iterator getPorts(); }中国IT动力uMHNXr1
方法getPorts返回由该服务成组的端口的一列限定的名称(像javax.xml.rpc.namespace.QName)。方法createCall的多个变体创建javax.xml.rpc.Call的实例。javax.xml.rpc.Call接口为目标服务端口上的操作的动态调用提供支持。客户端JAX-RPC 1.0实现是必需的,以实现javax.xml.rpc.Call接口。javax.xml.rpc.Service接口充当用于创建javax.xml.rpc.Call实例的工厂。Service实现类是必需的,以实现java.io.Serializable和javax.naming.Referenceable实例来支持JNDI名称空间中的注册。中国IT动力uMHNXr1
JAX-RPC:工具中国IT动力uMHNXr1
因为JAX-RPC定义关于WSDL文档如何映射到相应Java表示的精确规则,所以映射过程最好使用工具自动完成。因此,WSDL到Java映射工具将读WSDL文档,并产生服务接口及其实现类,即服务定义接口。服务定义接口扩展java.rmi.Remote stub类,而该stub类实现javax.xml.rpc.Stub接口和服务及stub类所需的任何附加类。这些附加类包括serializer、deserializer和utility类。事实上,这里以外的许多工具已经在做这些事情了,并且JAX-RPC将标准化这一映射过程。中国IT动力uMHNXr1
JAX-RPC:可扩展的类型映射中国IT动力uMHNXr1
JAX-RPC 1.0规范指定XML数据类型和Java类型之间的标准映射。标准类型映射支持SOAP 1.1 编码和XML Schema规范中定义的一组XML数据类型。标准类型映射也为JAX-RPC 1.0支持的Java类型组指定了XML映射。但是,JAX-RPC 1.0实现需要支持超出标准类型映射规范指定的XML数据类型和Java类型之间的映射。例如,如果你有自定义的Java数据类型,那么它需要被映射到XML表示。中国IT动力uMHNXr1
JAX-RPC 1.0指定API以支持可扩展类型映射框架。这些API允许可插入串行化器和反串行化器的部署,以支持任何Java API类型和XML数据类型之间的可扩展映射。可插入的串行化器和反串行化器可以被打包作为JAX-RPC 1.0实现的一部分,或者可以由工具提供商、服务开发者和服务客户来提供。中国IT动力uMHNXr1
使用不同的XML处理机制和表示,类型映射框架应该允许可插入串行化器和反串行化器的部署。但是,JAX-RPC 1.0版本中并没有解决跨各种JAX-RPC实现的可插入串行化器和反串行化器的可移植性。中国IT动力uMHNXr1
JAX-RPC包中国IT动力uMHNXr1
图5显示了各种包之间的关系。RPC包和消息传递包都将SOAP包用于创建、操纵和处理SOAP消息。并且RPC包用于RPC,而消息包用于消息传递。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图5:包关系中国IT动力uMHNXr1
JAXR 中国IT动力uMHNXr1
注册中心的典型应用是什么? 注册中心的功能相当于一个电子黄页, 商业组织的信息和他们所提供的服务和产品可以在这里发布和发现。注册中心也可以当作数据库,或者共享信息存储库。共享的信息可以是任何东西。注册中心也可以看作电子公告板, 合作伙伴就可以以一种动态的、临时的方式共享信息。注册服务的典型操作是什么呢?首先,提交和保存共享信息是比较重要的注册操作。我们还需要完成各种注册管理操作,比如标识、命名、描述、分类、关联、分组和标注。最后,我们还必须能够从注册中心完成查询、发现和获取共享的信息等操作。所以任何注册中心的编程API都需要支持这些操作。JAXR (Java API for XML Registry) 为在不同的注册服务提供者之间进行以上注册操纵提供了一套标准的Java API。同时它也为描述注册内容定义了一个统一的信息模型。所以不用考虑要访问的注册服务提供者,你的程序可以对通用的信息模型进行操作。由于注册提供者性能上的多样性,JAXR设计组决定通过性能描述来提供多层API抽象。中国IT动力uMHNXr1
JAXR将成为J2EE(J2EE 1.4)的一部分,而J2EE 1.4将会成为Web服务开发和部署的首选平台。这就意味着J2EE 1.4平台的开发商们为了与1.4的标准兼容必须提供JAXR服务(虽然不一定要是注册服务)。中国IT动力uMHNXr1
JAXR: 性能描述中国IT动力uMHNXr1
在JAXR中,相关的注册服务特性被分组成一个性能级别。每个性能级别用一个java 接口来体现,而每个相同性能级别中的特性对应于此java接口中的一个方法. 为了便于测试兼容性,减少交互协作中出现的问题,JAXR把性能划分成较小单位的性能描述集合. 一个性能描述定义了一类性能的集合(Java接口类型的集合),这些java接口类型的集合必须被整体所支持以符合该性能描述的要求. 目前,JAXR只定义了两个性能描述,基本特性的0级层和高级特性的1级层。最低限度下,所有的JAXR提供者必须实现0级架构。同时为了便于发现性能,JAXR还定义了一个发现接口,允许客户端访问和发现注册服务的性能.中国IT动力uMHNXr1
图6说明了不同的JAXR客户端上如何利用JAXR API与不同的注册中心进行交互操作的。在结构上,JAXR客户端利用API执行注册操作,而JAXR提供者实现这个API的功能。由于JAXR提供了一个标准的API来访问不同的注册提供者和描述注册内容的统一信息模型,无论是HTML浏览器、J2EE组件(如servlet 或者EJB beans)或独立的J2SE应用程序的JAXR客户端,都能够统一地对不同的注册提供者执行注册操作。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图6:客户端与注册中心的互操作性 中国IT动力uMHNXr1
图7是JAXR架构的描述,底部是现有的注册服务提供者,如ebXML, reg/rep, UDDI和其他类型. 这些注册服务提供者可以被特定注册服务的JAXR提供者访问。只要被注册服务提供者确认,特定注册服务的JAXR提供者就可以成为他们的客户端。从这个意义上讲,特定注册服务的JAXR提供者相当于是JAXR客户端的代理。这种可插拔的JAXR提供者实现了独立于注册服务类型的JAXR API的特性。可插拔的提供者为多样化的特定注册服务的JAXR提供者定义了单一的抽象。所以客户端在访问实际注册服务的时候可以不考虑特定注册服务的JAXR提供者的多样性。这些是与特定性能相关的接口。中国IT动力uMHNXr1
中国IT动力uMHNXr1
图07: JAXR 架构 中国IT动力uMHNXr1
总结中国IT动力uMHNXr1
正如此文所述,Java技术组通过坚持不懈地努力,为Web服务提供了一套非常全面的API。这套Java API包括基于XML的消息传送(JAXM),基于XML的远程过程调用(JAX-RPC),基于XML的注册服务操作(JAXR),为应用于Web 服务的全面完整的Java API的必然出现奠定了坚实基础。中国IT动力uMHNXr1 |