通过使用JAX-RPC(Java API for XML-based RPC),已有的Java类或Java应用都能够被重新包装,并以Web Services的形式发布。JAX-RPC提供了将RPC参数(in/out)编码和解码的API,使开发人员可以方便地使用SOAP消息来完成RPC调用。同样,对于那些使用EJB(Enterprise JavaBeans)的商业应用而言,同样可以使用JAX-RPC来包装成Web服务,而这个Web Service的WSDL界面是与原先的EJB的方法是对应一致的。JAX-RPC为用户包装了Web服务的部署和实现,对Web服务的开发人员而言,SOAP/WSDL变得透明,这有利于加速Web服务的开发周期。
针对基于 XML 的 RPC 的 Java API(JAX-RPC)规范允许您开发基于 SOAP 的可交互操作和可移植的 Web Service 和 Web Service 客户机。JAX-RPC 1.1 为在 Java 平台上开发和部署 Web Service 提供核心 API,并且它是 J2EE 1.4 平台的必需部件。J2EE 1.4 平台允许您开发可移植的 Web Service。Web Service 也可以在 J2EE 1.3 容器上开发和部署。
WebSphere Application Server 实现 JAX-RPC 1.1 标准。
JAX-RPC 标准对于 Java 语言的 Web Service 涉及使用 Web 服务描述语言(WSDL)的编程模型和绑定。JAX-RPC 通过屏蔽 SOAP 通信的底层复杂性来简化 Web Service 的开发。
表面上,JAX-RPC 看上去像是另一个实例化的远程方法调用(RMI)。本质上,JAX-RPC 允许客户机访问 Web Service,就象 Web Service 是映射至客户机地址空间的本地对象,即使 Web Service 提供程序位于世界的另一角落。JAX-RPC 是使用基于 XML 的协议 SOAP(它通常驻留在 HTTP 顶部)执行的。
JAX-RPC 定义 WSDL 端口类型和 Java 接口之间的映射,以及定义 Java 语言和可扩展标记语言(XML)模式类型之间的映射。
JAX-RPC Web Service 可以从 JavaBean 或企业 bean 实现创建。可以通过在 Java 接口中定义远程方法来指定远程过程。只需要编码实现方法的一个或多个类。剩余的类和其他工件由 Web Service 供应商的工具生成。以下是 Web Service 接口的示例:
package com.ibm.mybank.ejb;
import java.rmi.RemoteException;
import com.ibm.mybank.exception.InsufficientFundsException;
/**
* Remote interface for Enterprise Bean: Transfer
*/
public interface Transfer_SEI extends java.rmi.Remote {
public void transferFunds(int fromAcctId, int toAcctId, float amount)
throws java.rmi.RemoteException;
}
JAX-RPC 中的接口定义必须符合特定规则:
- 接口必须扩展 java.rmi.Remote,就象 RMI。
- 方法必须抛出 java.rmi.RemoteException。
- 方法参数不能为远程引用。
- 方法参数必须是 JAX-RPC 规范支持的某个参数。下表是受支持的方法参数的示例。有关方法参数的完整列表,请参阅 JAX-RPC 规范。
- 基本类型:boolean、byte、double、float、short、int 和 long
- 基本类型的对象包装器:java.lang.Boolean、java.lang.Byte、java.lang.Double、java.lang.Float、java.lang.Integer、java.lang.Long、java.lang.Short
- java.lang.String
- java.lang.BigDecimal
- java.lang.BigInteger
- java.lang.Calendar
- java.lang.Date
- 除了聚集值对象外,方法还可以采用组成先前列出类型的组合的值对象。
客户机创建存根并调用它上面的方法。存根象 Web Service 的代理一样运作。从客户机代码的角度来看,它看上去象本地方法调用。但是,每个方法调用编组到远程服务器。编组包括按 SOAP 协议规定编码 XML 中的方法调用。
以下是写 Web Service 和 Web Service 客户机所需的键类和接口。
- 服务接口:存根或动态调用的工厂和用于调用方法的代理对象。
- ServiceFactory 类:用于服务的工厂。
- loadService
WebSphere Application Server V6.0 中提供了 loadService 方法以生成 JAX-RPC 实现所需的服务定位器。如果重新调用,那么先前版本中没有特定方式以获取生成的服务定位器。对于受管客户机,您使用 JNDI 方法获取服务定位器,而对于非受管客户机,需要您实例化 IBM 的特定服务定位器 ServiceLocator service=new ServiceLocator(...);,该定位器不提供可移植性。loadService 参数包括:
- wsdlDocumentLocation:服务的 WSDL 文档位置的 URL 或 null。
- serviceName:服务的限定名
- 属性:一组特定于实现的属性,用于帮助查找生成的服务实现类。
- isUserInRole
isUserInRole 方法返回一个布尔值以表明端点实例上当前方法调用的已认证用户是否包含在特定的逻辑角色中。
- 角色:角色参数是指定角色名的字符串。
- 服务
- 调用接口:用于动态调用
- 存根接口:存根的基本接口
如果正在使用存根访问 Web Service 提供程序,将对您隐藏大多数 JAX-RPC API 详细信息。客户机创建 ServiceFactory(java.xml.rpc.ServiceFactory)。客户机实例化 ServiceFactory 的服务(java.xml.rpc.Service)。该服务是创建端口的工厂对象。该端口是 Web Service 的远程服务端点接口。在 DII 的情况下,服务对象用于创建调用对象,您可配置该调用对象以调用 Web Service 端口上的方法。