在 WebSphere Application Server Community Edition V2.0 中开发和部署 JAX-WS Web 服务

随着 Java™ EE 5 的出现和 JAX-WS 的引入,开发和部署 Web 服务变得比以前任何时候都要容易得多。了解如何使用 IBM® WebSphere® Application Server Community Edition V2.0(可以免费使用的 IBM 应用服务器上提供的最新版本,它是基于 Apache Geronimo 2.0 的)构建 JAX-WS 客户端和服务,并且立即开始构建您的第一个 JAX-WS Web 服务项目。

Jarek Gawor, Advisory Software Engineer, IBM

Author photoJarek Gawor 是 IBM 的一名顾问软件工程师,在北卡罗莱纳州三角研究工业园的 Software Group 工作。他是 Apache Geronimo 的参与者和 PMC 成员。他获得了伊利诺伊斯理工大学 (Illinois Institute of Technology) 的计算机科学硕士学位。



Lin Sun, 顾问软件工程师, IBM

Lin SunLin Sun 是北卡罗来纳州三角研究园的一名顾问软件工程师,在 Software Group WebSphere Application Server Community Edition Development 小组工作。她拥有教堂山北卡大学的信息科学硕士学位。



2007 年 10 月 18 日

引言

IBM WebSphere Application Server Community Edition V2.0(以下简称为 Community Edition)是构建于 Apache Geronimo 2.0 之上的应用服务器,而 Apache Geronimo 2.0 是由 Apache 软件基金会创建的开放源代码应用服务器。Community Edition 服务器是一个全面兼容的、并且经过认证的 Java Platform, Enterprise Edition 5.0 (Java EE 5) 容器,它适用于从开发环境到企业级部署的所有工作。

Java EE 5 引入了许多新的和经过更新的特性,如 Enterprise JavaBeans™ 3.0 (EJB 3),并且还通过使用注释和依赖关系注入简化了应用程序的开发和部署。Java API for XML-based Web services(JAX-WS)2.0 也是 Java EE 5 中引入的新特性之一。

JAX-WS

JAX-WS 2.0 是 Java EE 5 中新的 Web 服务堆栈,设计用于取代基于 Web 服务的旧的 Java API for XML-Based RPC (JAX-RPC) 1.1。JAX-WS 添加了大量新的特性,并在 JAX-RPC 上进行很大的改进,为以下的功能提供了支持:

  • Java Architecture for XML Binding (JAXB) 2.0。
  • 简单对象访问协议 (SOAP) 1.2,以及 SOAP 1.1。
  • Web 服务描述语言 (WSDL) 2.0,以及 WSDL 1.1。
  • 用于改进的 Web 服务互操作性的 Web 服务互操作性 (WS-I) 基本概要 1.1。

JAX-WS 的一个重要特性是使用注释简化 Web 服务客户端和端点的开发和部署。使用注释简化代码并减少(甚至在某些情况下完全消除)对部署描述符的需要。


开发 Web 服务端点

端点实现

使用 JAX-WS 来创建基本的 Web 服务是非常容易的:只需要使用 @WebService 注释来注释相应的类。清单 1 显示了提供简单 add() 函数的一个 JAX-WS 计算器服务的最简单实现。

清单 1. Calculator Web 服务实现
import javax.jws.WebService;

@WebService()
public class Calculator {
    
    public int add(int value1, int value2) {
        System.out.println("adding " + value1 + " and " + value2);
        return value1 + value2;
    }
}

就是这么简单!要部署和发布一个 JAX-WS Web 服务,您只需要编写经过注释的 Web 服务实现即可。您并不需要编写任何部署描述符,如 web.xml 或者 webservices.xml,或者创建一个 WSDL 文件。在部署期间,服务器将自动地更新或者生成这些描述符。当然,仍然可以提供这些描述符以覆盖缺省值并对部署工作进行自定义。例如,如果没有提供 web.xml 文件,那么在部署期间,服务器将自动生成一个 web.xml 文件:

  • 生成的 web.xml 文件将包含用于 Web 服务的 Servlet 映射。
  • 这个 Servlet 映射指定了触发给定 Web 服务的 URL 地址中的一部分。
  • 在缺省情况下,将该地址设置为 Web 服务名。在这个示例中,Web 服务的名称是 CalculatorService,因此,可以通过 /CalculatorService 地址访问这个 Calculator Web 服务。您可以通过为这个 Web 服务使用不同的 Servlet 映射条目来提供自定义 web.xml 文件,从而更改缺省地址。

另外,请注意,这个服务类并没有实现任何接口。在 JAX-WS 中,Web 服务不需要实现或者提供服务端点接口 (SEI)。在这样的情况下,SEI 将隐含于服务实现类中,正如这个示例中所示。

另外,因为 JAX-WS 使用 JAXB 进行所有的数据绑定,所以不再需要 jaxrpc-mapping 文件。

构建和部署服务

下面的步骤描述了如何构建和部署该服务。考虑到本文的目的,我们使用 Apache Maven 版本 2.0.5 或者更高版本来构建示例代码:

  1. 下载本文所包含的示例文件,并将其解压缩到您所选择的目录中。我们将这个目录称为 sample_install。
  2. 通过执行 sample_install\jaxw-calculator\service 目录中的 mvn install 命令,构建服务代码。这个 Maven 命令将编译服务代码,并在 target/subdirectory 中创建 jaxws-calculator-service-1.0.war 文件。
  3. 启动 Community Edition 服务器(如果它还没有运行的话)。使用管理控制台来部署 WAR 文件或者执行清单 2 中的命令,其中 wasce_install 是 Community Edition 的安装目录。
    清单 2. 部署服务 WAR 文件
    wasce_install\bin\deploy.bat --user system -password manager deploy
    sample_install\jaxws-calculator\service\target\jaxws-calculator-service-1.0.war
  4. 通过在您的 Web 浏览器中打开 http://localhost:8080/jaxw-calculator-service-1.0/CalculatorService?wsdl,检查是否成功地发布了该服务。如果成功地部署了该服务,并且该服务正在运行,那么服务器应该返回为这个服务生成的 WSDL。

部署 Web 服务客户端

要为该服务编写一个 Web 服务客户端,您首先需要由服务 WSDL 生成可移植的构件。这些可移植的构件是服务调用所需的一组类,如 SEI、服务类和 JAXB 生成的表现模式类型的类。可以使用 Community Edition 中包含的 jaxws-tools 命令行工具,或者来自 Sun Microsystem™ 的 wsgen 或者 wsimport 工具生成这些可移植的构件。

生成可移植的构件

考虑到本文的目的,您将使用 wsimport 工具来生成这些可移植的构件。wsimport 工具将 WSDL 文件作为输入,并生成所需的 SEI、服务和 JAXB 类。为了简化构建指令,可以将 wsimport 步骤集成到 Maven 构建脚本中。这个脚本使用 wsimport Ant 任务来生成可移植的构件。清单 3 显示了调用 wsimport Ant 任务的 Maven 构建脚本的代码摘录。

清单 3. wsimport Ant 任务
...
  <wsimport
      destdir="${pom.basedir}/target/classes"
      sourcedestdir="${pom.basedir}/target/generated"
      debug="true" keep="true"
      wsdl="http://localhost:8080/jaxws-calculator-service-1.0/CalculatorService?wsdl" />
...

在这个示例中,wsimport Ant 任务直接从该 Calculator Web 服务检索 WSDL。Community Edition 服务器必须启动并正在运行,并且必须正确地部署该服务,以便 wsimport 能够正常工作。

这些构件还可以由 Community Edition 中包含的 jaxws-tools 命令行工具,通过执行清单 4 中显示的命令来生成。

清单 4. 使用 jaxws-tools 命令
wasce_install\bin\jaxws-tools.bat wsimport 
     -s sample_install\jaxws-calculator\client\src\main\java 	
     http://localhost:8080/jaxws-calculator-service-1.0/CalculatorService?wsdl

客户端实现

清单 5 显示了一个基本的 Web 服务客户端实现。这是一个简单的 Servlet,它调用 Calculator Web 服务的 add() 函数并返回相应的结果。添加两个值,将其分别作为参数 x 和 y 传递到 Servlet。请注意,CalculatorService 类是 Service 类,而 Calculator 类是 wsimport 工具(在前面的步骤中)所生成的 SEI 类。将该客户端编写为一个 Servlet,以展示另一个新的 Java EE 5 特性:依赖关系注入。

清单 5. Calculator Web 服务客户端实现
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceRef;

public class CalculatorClient extends HttpServlet {

    @WebServiceRef CalculatorService service;
    
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        int x = Integer.parseInt(req.getParameter("x"));
        int y = Integer.parseInt(req.getParameter("y"));
        Calculator calculator = service.getCalculatorPort();
        int sum = calculator.add(x, y);
        resp.getWriter().println(x + " + " + y + " = " + sum);
    }

}

对服务变量的 @WebServiceRef 注释将使得服务器自动地在部署描述符中添加一个服务引用条目,在运行时,查找并将这个引用的值注入到该变量。以前在 Java 2 Platform, Enterprise Edition (J2EE) 中,不得不手工地完成这两个任务,您必须在部署描述符中明确地定义该服务引用,然后编写额外的代码以执行 JNDI 查找,获取实际的引用。

因为将 CalculatorClient 作为一个常规 Servlet,所以为了定义和发布该 Servlet,仍然需要一个 web.xml 文件。然而,web.xml 文件变得更加简单,如清单 6 所示,因为它不再需要定义服务引用。

清单 6. web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                             http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
         version="2.5">

    <display-name>JAX-WS Client Sample</display-name>

    <servlet>
        <display-name>JAX-WS Client Sample Servlet</display-name>
        <servlet-name>CalculatorClientServlet</servlet-name>
        <servlet-class>org.apache.geronimo.example.jaxws.CalculatorClient</servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>CalculatorClientServlet</servlet-name>
        <url-pattern>/client</url-pattern>
    </servlet-mapping>

</web-app>

构建和部署客户端

遵循下面的步骤以构建和部署客户端:

  1. 通过执行 sample_install\jaxw-calculator\client 目录中的 mvn install 命令构建客户端代码。这个 Maven 命令将首先生成客户端构件,然后编译客户端代码,最后在 target/subdirectory 目录中创建 jaxws-calculator-client-1.0.war 文件。
  2. 使用 Community Edition 管理控制台以部署 WAR 文件,或者执行清单 7 中的命令。
    清单 7. 部署客户端 war 文件
    wasce_install\bin\deploy.bat --user system -password manager deploy
    sample_install\jaxws-calculator\client\target\jaxws-calculator-client-1.0.war

测试这个 Web 服务示例

在部署了该客户端 war 文件之后,在您的 Web 浏览器中打开 http://localhost:8080/jaxw-calculator-client-1.0/client?x=5&y=10,以调用 CalculatorClient Servlet,而它反过来将调用 Calculator Web 服务。在 URL 中指定了要添加的 x 和 y 值。在调用该 Web 服务之后,Servlet 将返回加法运算的结果。图 1 显示了 Servlet 的预期输出。

图 1. Servlet 的结果
图 1. Servlet 的结果

结束语

由于 Java EE 5 的改进和 JAX-WS 的引入,开发和部署 Web 服务变得比过去任何时候都要简单得多。本文说明了如何使用 WebSphere Application Server Community Edition V2.0 构建 JAX-WS 客户端和服务,并在这个过程中突出了 Java EE 5 和 JAX-WS 的某些新特性。现在在 Community Edition 中开始您的第一个 JAX-WS Web 服务项目,并继续您的工作!


下载

描述名字大小
Code samplejaxws-calculator.zip8 KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=263072
ArticleTitle=在 WebSphere Application Server Community Edition V2.0 中开发和部署 JAX-WS Web 服务
publish-date=10182007