JAX-RPC表示基于XML远程调用的JavaAPI。它是用于构建Web服务以及使用远程调用(RPC)和XML客户端的API。通常用在分布式客户端/服务器模式中,RPC机制使得客户端可以执行其他系统中的过程。在JAX-RPC中,远程过程调用由SOAP这种基于XML的协议来表示。SOAP规范定义了封装结构,编码规则,以及远程过程调用和响应间的约定。这些调用和响应在http上作为SOAP消息进行传递。在这个版本中,JAX-RPC支持SOAP1.1和http1.1。尽管JAX-RPC建立在复杂的协议之上,但API为应用程序开发者隐藏了这一复杂性。在服务器端,开发人员通过定义Java编程语言中接口的方法来指定远程过程。开发者还将编写一个或多个实现这些方法的类。客户端程序也是容易编写的。一个客户生成一个代理,表示服务的本地对象,然后简单的调用代理上的方法。使用JAX-RPC,客户端和web服务都有巨大的优势——Java编程语言的平台无关性。另外,JAX-RPC是不受限制的:一个JAX-RPC客户可以访问没有运行在Java平台的web服务,反之亦然。JAX-RPC很灵活,因为它使用了全球网联合会(W3C)规定的技术:HTTP,SOPA以及Web服务描述语言(WSDL)。WSDL为以消息中操作的endpoint集的形势描述服务指定了一种XML格式。如果你是基于XML的RPC(JAX-RPC)的JavaAPI方面的新手,本章就是一个起点,简明扼要地描述了JAX-RPC后,本章将介绍如何构建一个简单的Web服务及其客户。对于高级用户,本章继续通过代码列表示例,一步一步的介绍动态客户的生成。简单示例:HelloWorld本例介绍了如何使用JAX-RPC来生成一个名为HelloWorld的Web服务。HelloWorld服务的远程客户可以调用sayHello方法,该方法接受一个字符串参数,然后返回一个字符串。运行期间的HelloWorld图11-1显示了HelloWorld服务部署后的简化状况。下面给出运行期间发生情况的详细描述:1.为了调用远程过程,HelloClient程序调用占位程序中的方法,表示远程服务的本地对象。2.占位程序调用JAX-RPC运行系统中的例程。3.运行系统将远程方法调用转换成SOAP消息,然后以一个HTTP请求的形式传输消息。4.当服务器接收到HTTP请求时,JAX-RPC运行系统从请求中提取SOAP消息,然后传送到方法调用。5.JAX-RPC运行系统调用约束对象中的方法。6.约束对象调用HelloWorld服务实现中的方法。7.服务器端运行系统将方法响应转换成SOAP消息,然后以HTTP响应的形式传输消息回客户端。8.客户端,JAX-RPC运行系统从HTTP响应中提取SOAP消息,然后传输到HelloClient程序的方法响应。图11-1运行期间的HelloWorld示例应用程序开发者只提供由图11-1描述的堆栈顶层,表11-1显示了各层的来源。表11-1谁(什么)提供该层HelloWorld文件为了使用JAX-RPC生成服务,应用程序开发人员必须提供一些文件。对于HelloWorld的例子,这些文件在JWSDP_HOME/docs/tutorial/examples/jaxrpc/hello目录中:HelloIF.java-服务定义接口HelloImpl.java-服务定义实现类,它实现了HelloIF接口HelloClient.java-远程客户,与服务联系,然后调用sayHello方法config.xml-由wscompile工具读取的配置文件jaxrpc-ri.xml-由wsdeploy工具读取的配置文件web.xml-web组件(servlet)的部署描述信息,由它分派服务安装首先必须设置环境变量PATH,包含这些目录:JWSDP_HOME/binJWSDP_HOME/jwsdp-shared/binJWSDP_HOME/jaxrpc-1.0.3/binJWSDP_HOME/jakarta-ant-1.5.1/bin接着,如果还没有这样做,按照“开始Tomcat”一章中介绍的:层源HelloClient程序HelloWorld服务(定义了接口以及实现的类)由应用程序开发者提供占位程序由wscomplie工具生成,由应用程序开发者运行约束由wsdeploy工具生成,由应用程序开发者运行JAX-RPC运行系统包含在JavaWSDP中生成编译属性文件启动Tomcat编译部署服务开发一个JAX-RPCWeb服务的基本步骤如下:1、编码服务定义接口和实现类2、编译第一步中的服务定义代码3、将代码打包成一个WAR文件4、生成约束和WSDL文件5、部署服务。接下来的章节将更详细地描述每个步骤。编码服务定义接口和实现类服务定义接口声明了服务中远程客户可以调用的方法。接口必须遵循几个规则:它继承了java.rmi.Remote接口它必须没有像publicfinalstatic这样的连续声明方法必须抛出java.rmi.RemoteException或它的一个子类。(方法也可以抛出服务指定的异常。)方法的参数和返回类型必须是支持的JAX-RPC类型。参见“JAX-RPC支持的类型”部分。在该例中,服务定义接口是HelloIF.java:packagehello;importjava.rmi.Remote;importjava.rmi.RemoteException;publicinterfaceHelloIFextendsRemote{publicStringsayHello(Strings)throwsRemoteException;}除接口外,还需要编写实现该接口的类。在这个例子中,实现类称为HelloImpl:packagehello;publicclassHelloImplimplemnetsHelloIF{publicStringmessage=”Hello”;publicStringsayHello(Strings){returnmessage+s;}}编译服务定义代码要编译HelloIF.java和HelloImpl.java,进入目录JWSD_HOME/docs/tutorial/examples/jaxrpc/hello,然后键入如下命令:antcompile-server该命令将产生的class文件放置在build/shared子目录中。打包WAR文件要生成包含服务代码的WAR文件,输入这些命令:antsetup-we-infantpackagesetup-wen-inf命令的目的是将class和XML文件复制到build/WEB-INF子目录中。而package的目的是运行jar命令,将文件包在名为dist/hello-portable.war的WAR文件中。这个WAR文件还不能部署,因为它不包含约束类。下一部分将会学习如何生成可部署的WAR文件。Hello-portable.war包含如下文件:WEB-INF/classes/hello/HelloIF.classWEB-INF/classes/hello/HelloImpl.classWEB-INF/jaxrpc-ri.xmlWEB-INF/web.xml其中class文件是由前面部分显示的compile-server目标生成的。web.xml文件是实现服务的Web应用程序的部署描述信息。和web.xml文件不同,jaxrpc-ri.xml文件不是规范的一部分,它是实现特有的。这个例子的jaxrpc-ri.xml文件的内容如下:?xmlversion=1.0encoding=UTF-8?webServicesxmlns==1.0targetNamespaceBase===/wsendpointname=MyHellodisplayName=HelloWorldServicedescription=Asimplewebserviceinterface=hello.HelloIFimplementation=hello.HelloImpl/endpointMappingendpointName=MyHellourlPattern=/hello//webServices在WSDL文件中使用了一些webServices属性,例如targetNamespaceBase,这些将在下一节中生成。(WSDL文件可以很复杂,在指南中不作讨论。参见“更多信息”。)注意,urlPattern的值(/hello)是服务的URL的一部分,这将在“验证部署”部分描述。关于jaxrpc-ri.xml文件的更多信息,请参见“jaxrpc-ri.xml文件”部分。如果你是高级用户,可能希望检验XML模式文件:JWSDP_HOME/docs/tutorial/examples/jaxrpc/common/jax-rpc-ri-dd.xsd。生成约束和WSDL文件要生成约束和WSDL文件,输入下列命令:antprocess-war该命令按下列方式运行wsdeploy工具:wsdeploy–tmpdirbuild/wsdeploy-generated-odist/hello-deployable.wardist/hello-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文件、约束类以及中间源代码文件。如果指定了-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工具”部分。