1、 JAX-RPC表示基于XML远程调用的Java API。它是用于构建Web服务以及使用远程调用(RPC)和XML客户端的API。通常用在分布式客户端/服务器模式中,RPC机制使得客户端可以执行其他系统中的过程。 在JAX-RPC中,远程过程调用由SOAP这种基于XML的协议来表示。SOAP规范定义了封装结构,编码规则,以及远程过程调用和响应间的约定。这些调用和响应在http上作为SOAP消息进行传递。在这个版本中,JAX-RPC支持SOAP1.1和http1.1。 尽管JAX-RPC建立在复杂的协议之上,但API为应用程序开发者隐藏了这一复杂性。在服务器端,开发人员通过定义Jav
2、a编程语言中接口的方法来指定远程过程。开发者还将编写一个或多个实现这些方法的类。客户端程序也是容易编写的。一个客户生成一个代理,表示服务的本地对象,然后简单的调用代理上的方法。 使用JAX-RPC,客户端和web服务都有巨大的优势——Java编程语言的平台无关性。另外,JAX-RPC是不受限制的:一个JAX-RPC客户可以访问没有运行在Java平台的web服务,反之亦然。JAX-RPC很灵活,因为它使用了全球网联合会(W3C)规定的技术:HTTP,SOPA以及Web服务描述语言(WSDL)。WSDL为以消息中操作的endpoint集的形势描述服务指定了一种XML格式。 如果你是基于
3、XML的RPC(JAX-RPC)的Java API方面的新手,本章就是一个起点,简明扼要地描述了JAX-RPC后,本章将介绍如何构建一个简单的Web服务及其客户。对于高级用户,本章继续通过代码列表示例,一步一步的介绍动态客户的生成。 简单示例:HelloWorld 本例介绍了如何使用JAX-RPC来生成一个名为HelloWorld的Web服务。HelloWorld服务的远程客户可以调用sayHello方法,该方法接受一个字符串参数,然后返回一个字符串。 运行期间的HelloWorld 图11-1显示了HelloWorld服务部署后的简化状况。下面给出运行期间发生情况的详细描述:
4、1. 为了调用远程过程,HelloClient程序调用占位程序中的方法,表示远程服务的本地对象。 2. 占位程序调用JAX-RPC运行系统中的例程。 3. 运行系统将远程方法调用转换成SOAP消息,然后以一个HTTP请求的形式传输消息。 4. 当服务器接收到HTTP请求时,JAX-RPC运行系统从请求中提取SOAP消息,然后传送到方法调用。 5. JAX-RPC运行系统调用约束对象中的方法。 6. 约束对象调用HelloWorld服务实现中的方法。 7. 服务器端运行系统将方法响应转换成SOAP消息,然后以HTTP响应的形式传输消息回客户端
5、 8. 客户端,JAX-RPC运行系统从HTTP响应中提取SOAP消息,然后传输到HelloClient程序的方法响应。 图11-1 运行期间的HelloWorld示例 应用程序开发者只提供由图11-1描述的堆栈顶层,表11-1显示了各层的来源。 表11-1谁(什么)提供该层 层 源 HelloClient程序 HelloWorld服务(定义了接口以及实现的类) 由应用程序开发者提供 占位程序 由wscomplie工具生成,由应用程序开发者运行 约束 由wsdeploy工具生成,由应用程序开发者运行 JAX-RPC运行系统 包含在Java WSDP中
6、
HelloWorld文件
§ 为了使用JAX-RPC生成服务,应用程序开发人员必须提供一些文件。对于HelloWorld的例子,这些文件在
7、配置文件
§ web.xml- web组件(servlet)的部署描述信息,由它分派服务
安装
首先必须设置环境变量PATH,包含这些目录:
8、口和实现类 2、 编译第一步中的服务定义代码 3、 将代码打包成一个WAR文件 4、 生成约束和WSDL文件 5、 部署服务。 接下来的章节将更详细地描述每个步骤。 编码服务定义接口和实现类 服务定义接口声明了服务中远程客户可以调用的方法。接口必须遵循几个规则: 它继承了java.rmi.Remote接口 它必须没有像public final static这样的连续声明 方法必须抛出java.rmi.RemoteException或它的一个子类。(方法也可以抛出服务指定的异常。) 方法的参数和返回类型必须是支持的JAX-RPC类型。参见“JAX-RP
9、C支持的类型”部分。 在该例中,服务定义接口是HelloIF.java: package hello; import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloIF extends Remote{ public String sayHello(String s) throws RemoteException; } 除接口外,还需要编写实现该接口的类。在这个例子中,实现类称为HelloImpl: package hello; public class HelloI
10、mpl implemnets HelloIF{
public String message=”Hello”;
public String sayHello(String s){
return message+s;
}
}
编译服务定义代码
要编译HelloIF.java和HelloImpl.java,进入目录
11、文件 要生成包含服务代码的WAR文件,输入这些命令: ant setup-we-inf ant package setup-wen-inf命令的目的是将class和XML文件复制到build/WEB-INF子目录中。而package的目的是运行jar命令,将文件包在名为dist/hello-portable.war的WAR文件中。这个WAR文件还不能部署,因为它不包含约束类。下一部分将会学习如何生成可部署的WAR文件。Hello-portable.war包含如下文件: WEB-INF/classes/hello/HelloIF.class WEB-INF/classes
12、/hello/HelloImpl.class
WEB-INF/jaxrpc-ri.xml
WEB-INF/web.xml
其中class文件是由前面部分显示的compile-server目标生成的。web.xml文件是实现服务的Web应用程序的部署描述信息。和web.xml文件不同,jaxrpc-ri.xml文件不是规范的一部分,它是实现特有的。这个例子的jaxrpc-ri.xml文件的内容如下:
13、etNamespaceBase="http://com.test/wsdl"
typeNamespaceBase="http://com.test/types"
urlPatternBase="/ws">
14、mplementation="hello.HelloImpl"/>
15、jaxrpc-ri.xml文件的更多信息,请参见“jaxrpc-ri.xml文件”部分。如果你是高级用户,可能希望检验XML模式文件:
16、portable.war 该命令运行wsdeploy工具,它执行这些任务: 读取dist/hello-portable.war文件作为输入 从hello-portable.war文件中包含的jaxrpc-ri.xml文件里获得信息 为服务生成约束类 生成名为MyHello.wsdl的WSDL文件 将约束类、Hello.wsdl文件,以及hello-portable.war文件的内容打包形成一个名为dist/hello-jaxrpc.war的可部署的WAR文件。 -tmpdir选项指定wsdeploy将生成的文件存储在哪个目录,生成的文件包括WSDL文件、约束类以及
17、中间源代码文件。如果指定了-keep选项,这些文件不会被删除。 有几种方式可以访问由wsdeploy生成的WSDL文件: 运行带有-keep选项的wsdeploy,然后在由-tmpdir选项指定的目录中查找WSDL文件 拆开WAR文件(jar –x),由wsdeploy输出,然后到WEB-INF目录中查找WSDL文件 按下面部分描述的来部署和验证服务。“验证部署”中显示的URL对应的HTML页面中有一个到WSDL文件的链接。 注意wsdeploy工具并不部署服务;而是生成一个可以被部署的WAR文件。在下一部分,将会部署wsdeploy生成的hello-jaxrpc.war文件所包含的服务。关于wsdeploy的更多信息,参见“wsdeploy工具”部分。






