JAX-RPC构建Web服务

Dale Green

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为应用程序开发者隐藏了这一复杂性。在服务器端,开发人员通过定义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)的Java API方面的新手,本章就是一个起点,简明扼要地描述了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谁(什么)提供该层

HelloClient程序

HelloWorld服务(定义了接口以及实现的类)

由应用程序开发者提供

占位程序

由wscomplie工具生成,由应用程序开发者运行

约束

由wsdeploy工具生成,由应用程序开发者运行

JAX-RPC运行系统

包含在Java WSDP中

 

 

 

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>/bin
<JWSDP_HOME>/jwsdp-shared/bin
<JWSDP_HOME>/jaxrpc-1.0.3/bin
<JWSDP_HOME>/jakarta-ant-1.5.1/bin

接着,如果还没有这样做,按照“开始Tomcat”一章中介绍的:

编译部署服务

开发一个JAX-RPC Web服务的基本步骤如下:

1、   编码服务定义接口和实现类

2、   编译第一步中的服务定义代码

3、   将代码打包成一个WAR文件

4、   生成约束和WSDL文件

5、   部署服务。

接下来的章节将更详细地描述每个步骤。

编码服务定义接口和实现类

服务定义接口声明了服务中远程客户可以调用的方法。接口必须遵循几个规则:

  • 它继承了java.rmi.Remote接口
  • 它必须没有像public final static这样的连续声明
  • 方法必须抛出java.rmi.RemoteException或它的一个子类。(方法也可以抛出服务指定的异常。)
  • 方法的参数和返回类型必须是支持的JAX-RPC类型。参见“JAX-RPC支持的类型”部分。

在该例中,服务定义接口是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 HelloImpl implemnets HelloIF{

    public String message=”Hello”;

    public String sayHello(String s){
       return message+s;
   }
}

编译服务定义代码

要编译HelloIF.java和HelloImpl.java,进入目录<JWSD_HOME>/docs/tutorial/examples/jaxrpc/hello,然后键入如下命令:

ant compile-server

该命令将产生的class文件放置在build/shared子目录中。

打包WAR文件

要生成包含服务代码的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/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文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<webServices
   xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
       version="1.0"
   targetNamespaceBase="http://com.test/wsdl"
   typeNamespaceBase="http://com.test/types"
   urlPatternBase="/ws">
        <endpoint
       name="MyHello"
            displayName="HelloWorld Service"
       description="A simple web service"
             interface="hello.HelloIF" 
             implementation="hello.HelloImpl"/> 

         <endpointMapping
             endpointName="MyHello"
             urlPattern="/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文件,输入下列命令:

ant process-war

该命令按下列方式运行wsdeploy工具:

wsdeploy –tmpdir build/wsdeploy-generated
-o dist/hello-deployable.war dist/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工具”部分。

 

 

 

常见问答

下载中心

产品简介

 

 

Solaris论坛