Web服务是基于一系列工业标准的软件程序,它们可以被共享,可以被用作为分布式基于Web的应用的组件。Web服务可以由一个URI来标识,它们的公共接口可以用XML来描述和发现。
随着互操作性和应用集成需求的增长,Web服务被认为是最理想的商业解决方案,因为它们是是基于标准的互联网协议。Web服务通过讲通用的,非私有的语言,使用公共的传输协议(例如,HTTP和SMTP),使得应用程序可以处理来自远程的,不同系统的请求。
本文重点描述使用Axis构建廉价的Web服务来解决前面所提及的问题。Axis是Apache提供的一个开放源代码的SOAP实现。为了公正,本文的Web服务构建将基于JAX-RPC,后续文章将介绍其他方法。
基于XML的远程过程调用的Java API(JAX-RPC)简化了Web服务的创建过程(Web服务本身就合并了基于XML的PRC)。它定义了Java类型和XML类型之间的映射,目的是为了隐藏XML的细节,提供一种熟悉的方法调用范例。本文详细阐述了开发者怎样使用JAX-RPC来实现和调用基于SOAP的Web服务,这些以Web服务描述语言(WSDL)所描述的Web服务使用了Apache提供的开放源代码工具--用于部署服务的Apache Tomcat和SOAP实现Apache Axis。
1. 基于JAX-RPC的Web服务
JAX-RPC完全包容了Web服务的异构性。它允许一个JAX-RPC客户端与另一个部署在不同平台上的,用不同语言编写的Web服务进行对话。JAX-RPC提供了一系列规范,包括调用模式、客户端生成、参数模式、Java到WSDL和WSDL到Java的类型映射、以及调用Web服务的客户端APIs。
2. 调用模式与客户端
JAX-RPC支持三种Web服务调用模式:
A. 同步请求--响应(Synchronous request-response):客户端调用Web服务上的一个远程方法,在Web服务处理期间调用线程阻塞,直到接收到一个返回值或者异常。
B. 单向(One-way)PRC模式(One-way RPC mode):客户端以单向模式调用Web服务上的一个远程方法,线程并不阻塞,并且继续执行。客户端不接收任何返回值。
C. 非阻塞RPC模式(Non-blocking RPC mode):客户端调用Web服务上的一个远程方法,该线程继续处理。稍候,客户端通过执行一个接收模块或者轮询返回值来处理远程方法。
有了本文上述的调用模式,我们来看看在Tomcat-Axis组合上怎样使用同步请求--响应模式编写或生成Java客户端。
3. 参数模式(Parameter Modes)
基于JAX-RPC的Web服务调用使用的是拷贝传值的参数传递方式。它不支持引用传值的参数传递方式。
JAX-RPC支持下列参数模式:
A. IN模式:一个IN类型的参数传递的是一个拷贝。IN类型参数的值在Web服务调用之前就被拷贝。返回值也被创建为一个拷贝,然后返回给Web服务的客户端。
B. OUT模式:OUT类型的参数被作为一个没有任何输入值的拷贝传递给Web服务方法。Web服务方法填充OUT参数,然后把它返回给客户端。
C. INOUT模式:INOUT参数被作为一个具有一个输入值的拷贝传递给给Web服务方法。Web服务方法使用这个输入值,处理它,用一个新值填充INOUT参数,然后返回给客户端。
OUT和INOUT参数的参数传递模式都是使用Holder类。使用Holder类使得映射可以保持预期的WSDL签名和参数传递语义。JAX-RPC规范包括简单XML类型到Java数据类型的映射的“Holder类”。在JAX-RPC实现的javax.xml.rpc.holders包中可以得到原子数据类型(例如,int,float等等)的Holder类。对复杂的XML数据类型来说,Holder类的名字是通过在相对应的Java类的后面附加"Holder"来构成的。这些生成Holder类作为生成子包Holders的一部分被包装在WSDL到Java的映射中。
每个Holder类提供下列方法和属性:
A. 一个公共属性“value”,“value”的类型就是相映射的Java类型。
B. 一个默认的构造函数,用来初始化“value”属性为一个默认的值。
C. 一个把“value”属性的值设置为传入参数的构造函数。
4. Web服务调用
Apache Tomcat-Axis组合提供一个JAX-RPC 1.0兼容的运行时引擎,它具有客户端和服务器端库以及部署工具。图1详细阐述了标准的同步请求--响应模式的Web服务调用框架。封装了Web服务客户端的Application1使用JAX-RPC运行时环境执行一个远程过程调用请求封装了Web服务服务器端的Application 2的公共方法。客户端使用运行时库把Java对象序列化成一个SOAP消息,然后通过HTTP协议把该消息发送给Web服务端点。当部署在Apache Tomcat上的Web服务接收到这个请求时,服务器端的JAX-RPC运行时库把SOAP消息反序列化为Java类型,并且调用Web服务上的方法,接着对Application 2进行调用。在处理完请求后,Web服务以类似的方式把响应发回给客户端。
图1 Web服务调用框架
至此,我们已经了解基于JAX-RPC的Web服务调用。本文的下一部分将在Apache Tomcat-Axis组合上简要的开发一个示例Web服务,一个动态客户端。