UML软件工程组织

 

 

使用 Eclipse SOA Tools Platform 插件构建和部署 Web 服务
用于简化 Web 服务开发的 Eclipse 插件
作者:Tyler Anderson 出处: IBM
 

在本教程中:

现在,可以很好地使用 Eclipse SOA Tools Platform (STP) 进行工作,并且可以期待在未来几个月中使用大量新功能来辅助面向服务的架构(Service-Oriented Architecture,SOA)开发。Eclipse STP 于 2005 年成为 Eclipse 组织的第九个顶级项目,并且从那以后一直在进行开发。使用 Eclipse STP 插件,您可以在 Java™ 接口中,使用与 Web 服务相关的属性对它进行注释,为 Web 服务创建 Web 服务描述语言(Web Services Description Language,WSDL),生成并编码 Java 桩,随后编译到 WAR 文件,并部署到您最喜欢的 Web 服务器上。本教程将向您展示如何使用 Eclipse STP 插件完成所有这些工作。

开始之前

什么是 SOA?SOA 的定义是:“支持将业务转换为在需要时可通过网络访问的一组链接服务或可重复的业务任务的 IT 架构样式”。

为什么使用 Eclipse STP?它的目标是 “构建框架和可仿效的扩展工具,使您可以设计、配置、装配、部署、监视和管理围绕 SOA 设计的软件”。

关于本教程

本教程适用于想要了解如何使用 Eclipse SOA Tools Project (STP) 插件及如何简化 SOA 开发的面向服务架构(Service-Oriented Architecture,SOA)和 Web 服务开发人员。

本教程将展示使用 Eclipse STP 插件构建 Web 服务的优点及简单性。您将了解如何使用 STP 插件完成以下操作:

  • 创建项目
  • 开发 Java 接口
  • 用 Web 服务属性为接口添加注释
  • 生成 WSDL
  • 从 WSDL 生成 Java 代码
  • 向 Web 服务中添加实现代码
  • 编译 Web 服务的 WAR 文件
  • 部署和测试 Web 服务

系统需求

本教程依赖于若干种 Eclipse 和 Apache 技术,用于配合 STP 插件进行开发:

Eclipse
Eclipse 是运行 Eclipse SOA Tools 插件的平台。从 Eclipse Foundation 下载 Eclipse V3.2
Eclipse STP 必备插件
在安装 STP 插件之前,需要先安装几个必备插件。STP 下载页面 中列出了指定的 STP 版本的版本号和下载链接。撰写本文时,最新稳定版 是 2007 年 2 月 1 日发布的。“系统要求” 部分显示了需要下载和安装的插件。您应当已经安装了 Eclipse V3.2。必备插件包括:
 
Eclipse STP Core SDK
现在您已经获得了必备插件,可以在 STP 下载页面的 “SOA Tools Platform” 部分下载 STP Core SDK 插件。
Eclipse STP ServiceCreation
除了 STP Core SDK 以外,您还需要通过 STP Core SDK 下载链接下载 STP ServiceCreation 插件。
Eclipse STP SOAS
除了 STP Core SDK 以外,您还需要通过 STP Core SDK 和 STP ServiceCreation 下载链接下载 STP SOAS 插件。
Eclipse DTP SDK
您需要使用 Eclipse DTP 来协助部署 Web 服务器,而不是部署到 Eclipse 内部绑定的独立 Web 服务器上。
Eclipse Apache CXF 插件
除此之外,STP 插件还使用 Apache CXF 的 JAX-WS 实现。
Apache CXF Runtime
安装所有插件后,需要告诉 Eclipse 可以找到 Apache CXF Runtime 的位置。
Apache Tomcat
您将通过把 Web 服务部署到 Apache Tomcat 上来执行最终测试。下载最新的 Apache Tomcat V5.5。

在开始编写本教程中后面的代码之前,您将了解关于安装的更多详细信息。

返回

简介

随着各大公司及其应用程序越来越多地依赖于 Web,SOA 也变得越来越流行。Eclipse STP 插件旨在简化 Web 服务和 SOA 的部署。本节将向您介绍本教程中要创建的 STP 插件和应用程序。

为什么使用 STP?

SOA 包含若干个 Web 服务,它们将互动并协作以建立整个应用程序而不是单片应用程序。另一方面,SOA 更易于维护和部署,因为它是用一个 Web 服务构造的,每次构造一个构建块。这就是 STP 可以帮助您完成的工作:构建和部署各个 Web 服务。

如果您曾尝试创建一个 Web 服务,您就会知道它是一项多么有挑战性的任务。通常在最后会获得许多文件,但是只需要更改这些文件中的一两个。不仅如此,而且初学者也很难掌握命令行工具。

STP 插件克服了这个问题,将整个流程引入基于灵活的 GUI 的环境:Eclipse。STP 插件使 SOA 更简单,因为从字面上说,正如您将在本教程中所见,任何人都可以用它构建和部署 Web 服务。它是如此简单,会让您有种相见恨晚的感觉。

STP 插件的优点

使用 STP 插件的主要优点来自 Apache CXF 的,它是 STP 插件使用的 Java API for XML Web services (JAX-WS) 实现。Apache CXF 允许您使用 Java 注释而不是大量选项来定义复杂的 Web 服务,从而简化 Web 服务的创建。

而且还有另外一个优点,您可以完全按照第一次采用的方法重新创建 Web 服务,而无需保存使用过的任何选项。这是因为那些选项已经使用 Java 注释构建到了 Java 接口中。

应用程序概述

在本教程中,您将创建用作执行以下函数的科学计算器的 Web 服务:

  • float add(float, float)
  • float square(float)
  • float divide(float, float)
  • float subtract(float, float)
  • float multiply(float, float)
  • float squareRoot(float, float)
  • float inverse(float)
  • float subtractUnary(float)

首先,我们将创建定义以上方法的 Java 接口,然后使用 Java Web 服务属性来为它们注释。其次,通过接口生成 WSDL,并通过 WSDL 来生成客户机桩和服务桩。最后,定义 Web 服务的功能并创建客户机。结果,我们将获得一个可以使用客户机测试的功能完整的 Web 服务。

返回

安装和创建 STP 项目

由于涉及许多附加插件和运行时,因此 STP 插件的安装并不简单。本节将展示良好的安装方法,完成所有插件及 CXF 运行时的安装。

安装 Eclipse 及必需的插件

下载完所有必需的插件后,您就可以开始安装它们了。把已下载的所有内容放入同一个目录中,并且:

  1. 解压缩已下载的 Eclipse V3.2 软件包。您应当会看到名为 eclipse 的目录。Eclipse 二进制文件位于 eclipse/eclipse.exe。
  2. 解压缩 DTP SDK、EMF-SDO-XSD SDK、GEF SDK、GMF Runtime、JEM SDK、WTP SDK、STP Core SDK、STP ServiceCreation 和 STP SOAS 插件。系统可能会询问您是否覆盖所有文件,单击 Yes to all 即可。
  3. 解压缩已下载的 Apache CXF 插件。将显示名为 plug-ins 的目录。将 plug-ins 移到 eclipse 目录中。它将询问您是否替换插件目录内的现有文件,单击 Yes to all 即可。

这就完成了 Eclipse 端的安装。接下来,我们安装 CXF Runtime。

安装 Apache CXF Runtime

您应当已经下载了 CXF Runtime。通过解压缩来安装 CXF Runtime,并记下它的安装目录(本教程中为 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT)。在创建第一个项目时将需要使用它。

创建第一个 STP 项目

您已经准备好打开 Eclipse。打开 Eclipse 时,它将要求您提供工作区,并且您可以将工作区安排在任意位置,然后单击 Enter。Eclipse 完成装入时:

  1. 单击 File > New Project
  2. 选择 SOA Tools > JAX-WS Java First Project
  3. 单击 Next
  4. 输入项目名称:com.ibm.dw.scicalc
  5. 单击 Finish

现在,项目已经创建完成,我们可以设定项目特定的属性:

  1. 转至 Project > Properties
  2. 单击 JAX-WS
  3. 在 Runtime Installation 框中输入 CXF 的安装目录(本教程中为 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT)
  4. 单击 Apply
  5. 现在单击 JAX-WS 的子属性 Apache CXF
  6. 在 WSDL Generation Options 窗格中,选择 SOAP 1.2,如图 1 所示

    图 1. 选择 SOAP V1.2 作为 WSDL 生成选项
    选择 SOAP V1.2 作为 WSDL 生成选项

     
  7. 单击 Apply,然后单击 OK
  8. 对首选项执行同样的操作;单击 Window > Preferences
  9. 单击 SOA Tools > JAX-WS
  10. 在 Installed runtimes 窗格的 Apache CXF 框中,输入 CXF 的安装目录(本教程中为 C:\apps\cxf-2.0-incubator-RC-SNAPSHOT)
  11. 单击 Apply
  12. 单击 JAX-WS 的子属性 Apache CXF
  13. 在 WSDL Generation Options 窗格中,选择 SOAP 1.2,类似于您在图 1 中所做的操作
  14. 单击 Apply,然后单击 OK

项目现在以及准备好开始工作了。开始编写代码之前,请先单击 Window > Open Perspective > Other 打开 JAX-WS 透视图。从列表中选择 JAX-WS 并单击 OK。您的窗口应当类似图 2。


图 2. JAX-WS 透视图中的项目
JAX-WS 透视图中的项目

很好!您已经准备好继续并开始进行 Java 接口的开发。

返回

创建 Java 接口

Java 接口是使用注释完整定义 Web 服务并稍后编译到 WSDL 中的起点。

Java 接口

在编写 Java 接口的代码之前,需要先将一个新接口添加到我们的项目中。右键单击项目(Navigator 窗口中的 com.ibm.dw.scicalc 文件夹),然后单击 New > Other。这将向您展示可以创建的内容列表。选择 Interface(紫色的 I)并单击 Next。输入使用 com.ibm.dw.scicalc 的软件包名称:ScientificCalculator。现在单击 Finish

现在在 src/com/ibm/dw/scicalc/ 目录中应当有一个空的 ScientificCalculator 接口。打开此文件,它应当类似与以下代码。

package com.ibm.dw.scicalc;

public interface ScientificCalculator {
}

 

接下来,我们将在 Java 接口中创建方法,这些方法将定义 Web 服务可以执行的操作。

定义 Web 服务操作

作为科学计算器类型的 Web 服务,我们创建的 Web 服务将具有 “应用程序概述” 部分中定义的函数。在接口中编写各个函数的代码,如下所示。


清单 1. 编写 Java 接口的代码
 
                    
public interface ScientificCalculator {
    public float squareRoot( // value^pow
        float value, 
        float pow
    );

    public float square( // value^2
        float value
    );

    public float inverse( // 1/value
        float value
    );

    public float divide( // numerator/denominator
        float numerator,
        float denominator
    );

    public float multiply( // value1*value2
        float value1,
        float value2
    );

    public float add( // value1 + value2
        float value1,
        float value2
    );

    public float subtract( // value1-value2
        float value1,
        float value2
    );

    public float subtractUnary( // -value
        float value
    );
}

注:我们只需声明方法 —— 即最终创建的 Web 服务的操作。它们大多数都有两个输入参数,而少数方法只有一个输入参数,每个输入参数都将返回操作结果。

接下来,我们将开始用 Web 服务特定的属性为 Java 接口进行注释。

注释类

首先将类注释为 Web 服务。在 Outline 视图中(左下),单击 Java 接口 ScientificCalculator。单击 SOA > JAX-WS > Create Web Service,然后单击 Finish。您将注意到以下代码被添加到您的代码中。


清单 2. 将 Java 接口注释为 Web 服务
 
                    
...
import javax.jws.WebService;
...
@WebService(wsdlLocation = "file:/C:/Documents and 
Settings/Tyler3/workspaces/STPwarCreate/com.ibm.dw.scicalc/wsdl/com/ibm
/dw/scicalc/ScientificCalculator
.wsdl", targetNamespace = "http://scicalc.dw.ibm.com/", name = "ScientificCalculator")

public interface ScientificCalculator {
...

实际上,我们已经声明了接口现在是 Web 服务,连同目标名称空间和名称。还定义了 WSDL 文件的创建位置。

通过添加以下代码,将最后一个注释手动添加到类中。


清单 3. 手动添加注释
 
                    
...
import javax.jws.soap.SOAPBinding; 
...
@WebService(wsdlLocation = "file:/C:/Documents and ...
...
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE,
             use = SOAPBinding.Use.LITERAL,
             style = SOAPBinding.Style.DOCUMENT) 

public interface ScientificCalculator {
...

 

我们使用文字和空参数样式声明了 DOCUMENT Web 服务的 SOAP 绑定。

这就完成了接口注释。接下来,我们将为 Web 服务的方法和操作创建注释。

注释方法

对方法进行注释几乎与注释类完全相同。首先对 squareRoot 方法注释。使用 Annotation Properties 视图来完成这项工作。如果看不到该视图,请选择 Window > Show View > Other。然后选择 SOA Tools > Annotation Properties。您应当会在视图的右下部分看到它。

要使用 Annotation Properties 视图创建注释,请将光标置于接口中的这一行上:public float squareRoot( // value^pow。查看 Annotation Properties 视图,应当会看到可用注释列表。


图 3. Annotation Properties 视图
Annotation Properties 视图

 

首先,添加 WebMethod 注释。您可以看到它显示在视图中。在 Annotation Properties 视图中选择它,单击它旁边的下拉框,并将 false 改为 true,应当会显示注释。


清单 4. WebMethod 注释
 
                    
...
import javax.jws.WebMethod;
...
    @WebMethod(operationName = "squareRoot", exclude=false)
    public float squareRoot( // value^pow
        float value,
        float pow
    );
...

 

您现在已经将 squareRoot 方法声明为 Web 服务中的操作。现在只有几个注释还需要完成:声明 Web 服务的返回值和参数。

选择 WebResult 注释并将 false 改为 true。这将把以下代码添加到您的代码中。


清单 5. WebResult 注释
 
                    
...
import javax.jws.WebResult;
...
    @WebResult(targetNamespace="http://scicalc.dw.ibm.com/",
                    name="return", partName="return")
    @WebMethod(operationName = "squareRoot", exclude=false)
    public float squareRoot( // value^pow
        float value,
        float pow
    );
...

向两个参数中添加 WebParam 注释。选择包含浮点值的行,然后在 Annotation Properties 框中选择 WebParam 注释,并将 false 改为 true。对 float pow 行执行相同的操作。返回到同一行并修改参数的属性。


图 4. 在 Annotation Properties 视图中修改注释
在 Annotation Properties 视图中修改注释

 

对于两个参数,我们已在 WebParam 注释中定义了名称和 partName 属性。您可以看到添加到清单 7 中的代码。


清单 6. 从 WebParam 注释属性添加的代码
 
                    
...
import javax.jws.WebParam;
...
    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/",
               partName = "return", name = "return")
    @WebMethod(operationName = "squareRoot")
    public float squareRoot( // value^pow
        @WebParam(targetNamespace="http://scicalc.dw.ibm.com",
                    partName = "value", name = "value")
        float value,
        @WebParam(targetNamespace="http://scicalc.dw.ibm.com",
                    partName = "pow", name = "pow")
        float pow
    );
...

 

您已经成功地对 squareRoot 方法进行了注释。接下来,我们将对其余方法进行注释。

对其他方法进行注释

在对其他方法快速注释之前,还有一种您应当了解的对方法进行注释的方式,它是对 Web 服务进行注释的补充方法。在 Outline 视图(左下)中选择 square(float) 方法,并且:

  • 选择 SOA > Create Web Method
  • 首先指定 WebMethod,可以保留原样;单击 Next
  • 不要选中 Add Annotation,因为不需要使用 RequestWrapper,然后单击 Next
  • 选中 Add Annotation,然后单击 Next
  • 不要选中 Add Annotation,因为不需要使用 ResponseWrapper,然后单击 Finish

应当会创建以下注释。


清单 7. 使用 create Web 方法创建的注释
 
                    
    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/",
               header=false,
               partName = "return", name = "return")
    @WebMethod(operationName = "square", exclude=false)
    public float square( // value^2
        float value
    );

 

您现在可以使用上一节的方法对值参数进行注释,将 square 方法的代码添加到以下代码中。

    public float square( // value^2
        @WebParam(partName = "value", name = "value")
        float value
    );

 

这样就完成了 square 方法!现在,您应当能够对其余方法进行注释了。完成后,它们应当如以下清单所示。


清单 8. 完成注释
 
                    
    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "inverse")
    public float inverse( // 1/value
        @WebParam(partName = "value", name = "value")
        float value
    );

    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "divide")
    public float divide( // numerator/denominator
        @WebParam(partName = "numerator", name = "numerator")
        float numerator,
        @WebParam(partName = "denominator", name = "denominator")
        float denominator
    );

    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "multiply")
    public float multiply( // value1*value2
        @WebParam(partName = "value1", name = "value1")
        float value1,
        @WebParam(partName = "value2", name = "value2")
        float value2
    );

    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "add")
    public float add( // value1 + value2
        @WebParam(partName = "value1", name = "value1")
        float value1,
        @WebParam(partName = "value2", name = "value2")
        float value2
    );

    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "subtract")
    public float subtract( // value1-value2
        @WebParam(partName = "value1", name = "value1")
        float value1,
        @WebParam(partName = "value2", name = "value2")
        float value2
    );

    @WebResult(targetNamespace = "http://scicalc.dw.ibm.com/", 
               partName = "return", name = "return")
    @WebMethod(operationName = "subtractUnary")
    public float subtractUnary( // -value
        @WebParam(partName = "value", name = "value")
        float value
    );

完成注释了!您可以开始生成 WSDL 了。

返回

生成 WSDL

在这一节中,我们将从 Java 接口中的注释转到 WSDL。

从 Java 接口生成 WSDL

要创建最新 WSDL 版本的 Java 接口,请确保保存接口。这将在项目中的 wsdl/com/ibm/dw/scicalc/ScientificCalculator.wsdl 自动创建 WSDL。

查看 WSDL

打开刚刚了解的 WSDL。注:除了服务的地址外(下一节介绍),您不需要更改任何内容,因为它是自动生成的。让我们检验一下生成了哪些内容。查看 WSDL 以了解下面的 squareRoot 操作(WSDL 中的其他详细信息已被删除,因为两者没有多大差别)。



清单 9. 自动生成的 WSDL
 
                    
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://scicalc.dw.ibm.com/" 
                 xmlns:tns="http://scicalc.dw.ibm.com/" 
                 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
                 xmlns:ns1="http://scicalc.dw.ibm.com/" 
                 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
                 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <xsd:schema targetNamespace="http://scicalc.dw.ibm.com/"
                version="1.0"
                xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="squareRoot0" type="xs:float"/>
      <xs:element name="squareRoot1" type="xs:float"/>
...
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="squareRoot">
    <wsdl:part name="value" element="tns:squareRoot0">
    </wsdl:part>
    <wsdl:part name="pow" element="tns:squareRoot1">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="squareRootResponse">
    <wsdl:part name="return" element="tns:return">
    </wsdl:part>
  </wsdl:message>
...
  <wsdl:portType name="ScientificCalculator">
    <wsdl:operation name="squareRoot">
      <wsdl:input name="squareRoot" message="tns:squareRoot">
    </wsdl:input>
      <wsdl:output name="squareRootResponse" 
                    message="tns:squareRootResponse">
    </wsdl:output>
    </wsdl:operation>
...
  </wsdl:portType>
  <wsdl:binding name="ScientificCalculatorBinding" 
                type="tns:ScientificCalculator">
    <soap12:binding style="document" 
        transport="http://www.w3.org/2003/05/soap/bindings/HTTP/"/>
    <wsdl:operation name="squareRoot">
      <soap12:operation style="document"/>
     <wsdl:input name="squareRoot">
        <soap12:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="squareRootResponse">
        <soap12:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
...
  </wsdl:binding>
  <wsdl:service name="ScientificCalculatorService">
    <wsdl:port name="ScientificCalculatorPort" 
               binding="tns:ScientificCalculatorBinding">
      <soap12:address location="http://localhost/changeme"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

注意 squareRoot 操作中使用的元素、参数(squareRoot0 squareRoot1 都是 float 类型)的模式。接下来,查看两条消息 —— 一条是请求消息,另一条是响应消息 —— 并注意它们如何引用模式中的两个元素。接下来是 porttype,它用于定义 squareRoot 操作,及其输入和输出消息。绑定将指定低级详细信息,如 SOAP 版本、传输类型 (document) 以及是否将文字格式或编码格式用于消息主体。最后,服务将指定 Web 服务的名称及其查找位置。您将在下一节中修改此行。

设定 Web 服务的地址

现在已经准备好了 WSDL。您只需对其位置做出微小的更改:最终发布 Web 服务的 URL。本教程将把它放在 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService。执行以下更改:


清单 10. 指定 Web 服务的位置
 
                    
...
  <wsdl:service name="ScientificCalculatorService">
    <wsdl:port name="ScientificCalculatorPort" 
               binding="tns:ScientificCalculatorBinding">
      <soap12:address location="http://localhost:8080/ScientificCalculator/services/
ScientificCalculatorService"/>
    </wsdl:port>
  </wsdl:service>
...

当您稍后部署了 Web 服务后,以上 URL 就是查看 Web 服务的位置。

返回

从 WSDL 生成代码

从 WSDL 创建客户机桩和服务桩

WSDL 完成后,在 Navigator 视图中选择 WSDL 文件,然后选择 SOA > Generate code


图 5. 生成代码
生成代码

 

在下一个屏幕中,确保选中 Server 和 Client,并单击 Finish。您现在应当会看到在 Navigator 视图中创建了若干个新文件,如图 6 所示。


图 6. 生成代码的结果
生成代码的结果

好的,已经生成了代码。接下来,您将定义服务代码。

返回

定义服务实现

服务实现是当某个事物(通常是客户机)调用 Web 服务上的操作时运行的代码。它不会马上执行什么操作,因此在本节中,我们将定义它并使其完成某些有用的操作。

实现类

实现类是自动生成的,下面是一些您感兴趣的方法 —— 定义 Web 服务操作的方法。在下一节中编写这些方法的代码。


清单 11. 自动生成服务实现类的方法
 
                    
...
public class ScientificCalculatorImpl implements ScientificCalculator {

    private static final Logger LOG = 
        Logger.getLogger(ScientificCalculatorImpl.class.getPackage().getName());

    public float add(
        float value1,
        float value2
    )
    { 
       LOG.info("Executing operation add");
        return 0.0f;
    }

    public float square(
        float value
    )
    { 
       LOG.info("Executing operation square");
        return 0.0f;
    }

    public float divide(
        float numerator,
        float denominator
    )
    { 
       LOG.info("Executing operation divide");
        return 0.0f;
    }

    public float subtract(
        float value1,
        float value2
    )
    { 
       LOG.info("Executing operation subtract");
        return 0.0f;
    }

    public float multiply(
        float value1,
        float value2
    )
    { 
       LOG.info("Executing operation multiply");
        return 0.0f;
    }

    public float squareRoot(
        float value,
        float pow
    )
    { 
       LOG.info("Executing operation squareRoot");
        return 0.0f;
    }

    public float inverse(
        float value
    )
    { 
       LOG.info("Executing operation inverse");
        return 0.0f;
    }

    public float subtractUnary(
        float value
    )
    { 
       LOG.info("Executing operation subtractUnary");
        return 0.0f;
    }
}

 

注:参数与在 Java 接口的 WebParam 注释中命名的参数完全相同。接下来将使用传入参数执行适当的函数并返回正确的结果。

为 Web 服务操作编写代码

因此,现在您只需要返回正确的操作值。它只是浮点型算法,您可能已经清楚这种算法。不管哪种算法,每种方法的代码如下所示:


清单 12. 编写 Web 服务操作的代码
 
                    
      LOG.info("Executing operation add");
        return value1 + value2;
...
      LOG.info("Executing operation square");
        return (float)Math.pow((double)value, 2);
...
      LOG.info("Executing operation divide");
        return numerator/denominator;
   
      LOG.info("Executing operation subtract");
        return value1-value2;
...
      LOG.info("Executing operation multiply");
        return value1*value2;
   
      LOG.info("Executing operation squareRoot");
        return (float)Math.pow((double)value, (double)pow);
...
      LOG.info("Executing operation inverse");
        return (float)1/value;
...
      LOG.info("Executing operation subtractUnary");
        return -value;
                

只需返回使用传入函数的值的有效计算。下一节将定义调用以上 Web 服务操作的代码。

返回

定义客户机代码

客户机代码允许您编写 Java 代码,这些 Java 代码可以与将在本教程中创建的 Web 服务以及其他 Web 服务进行交互。这一节将定义客户机代码。

客户机类

自动生成的客户机类已经简单地输出使用 Web 服务中每项操作的代码。看一看生成的内容。


清单 13. 自动生成的客户机代码
 
                    
...      
        ScientificCalculatorService ss = new \
        ScientificCalculatorService(wsdlURL, SERVICE_NAME);
        ScientificCalculator port = ss.getScientificCalculatorPort();  
        

        System.out.println("Invoking add...");
        float _add_return = port.add(0.0f,0.0f);
        
        System.out.println("Invoking square...");
        float _square_return = port.square(0.0f);
        
        System.out.println("Invoking divide...");
        float _divide_return = port.divide(0.0f,0.0f);
        
        System.out.println("Invoking subtract...");
        float _subtract_return = port.subtract(0.0f,0.0f);
        
        System.out.println("Invoking multiply...");
        float _multiply_return = port.multiply(0.0f,0.0f);
        
        System.out.println("Invoking squareRoot...");
        float _squareRoot_return = port.squareRoot(0.0f,0.0f);
        
        System.out.println("Invoking inverse...");
        float _inverse_return = port.inverse(0.0f);
        
        System.out.println("Invoking subtractUnary...");
        float _subtractUnary_return = port.subtractUnary(0.0f);
                
        
        System.exit(0);
    }
}

它还不是十分有用,但是在下一节中,您将修改它以传入有用的参数,并将结果显示到标准输出。

编写 Web 服务操作的客户机代码

现在您有了客户机,可以使用它来完整测试 Web 服务并根据需要执行回归测试。看一看添加的代码。


清单 14. 定义客户机代码
 
                    
...
        System.out.println("Invoking add...");
        float _add_return = port.add(1.2f,3.6f);
        System.out.println("Result: "+_add_return);
        
        System.out.println("Invoking square...");
        float _square_return = port.square(3);
        System.out.println("Result: "+_square_return);
        
        System.out.println("Invoking divide...");
        float _divide_return = port.divide(4.8f,1.2f);
        System.out.println("Result: "+_divide_return);
        
        System.out.println("Invoking subtract...");
        float _subtract_return = port.subtract(2.5f,0.5f);
        System.out.println("Result: "+_subtract_return);
        
        System.out.println("Invoking multiply...");
        float _multiply_return = port.multiply(1.5f,10.0f);
        System.out.println("Result: "+_multiply_return);
        
        System.out.println("Invoking squareRoot...");
        float _squareRoot_return = port.squareRoot(4.0f,0.5f);
        System.out.println("Result: "+_squareRoot_return);
        
        System.out.println("Invoking inverse...");
        float _inverse_return = port.inverse(2.0f);
        System.out.println("Result: "+_inverse_return);
        
        System.out.println("Invoking subtractUnary...");
        float _subtractUnary_return = port.subtractUnary(6.999f);
        System.out.println("Result: "+_subtractUnary_return);
...

在这里,将传入各种参数并将其显示给标准输出。因而,在运行客户机时,您可以看到输出并了解其工作原理。接下来,我们将部署和测试 Web 服务。

返回

部署和测试

看起来我们已经准备好部署和测试 Web 服务。在这一节中,我们将给 Web 服务打包以进行部署,使用 Representational State Transfer (REST) 和已构建的客户机部署并测试它。

创建 Web 服务的部署软件包

您必须先将代码打包到 WAR 文件以供部署,然后才能运行独立服务器并测试 Web 服务:

  • 在 Navigator 视图中选择 WSDL 文件
  • 单击 SOA > Generate Deploy Package

这将在项目的 WebContent/ScientificCalculator.war 中创建一个可部署的 WAR 文件。

现在您可以继续并运行独立的 Web 服务器。

运行独立的 Web 服务器

开发框架附带了一个独立的 Web 服务器,该服务器将允许您在 Eclipse 框架内执行 Web 服务的测试。

注:STP 插件已经创建了几个预配置的运行配置。要运行服务器,请执行以下操作:

  1. 在 Navigator 视图中双击 Java 接口
  2. 单击 Run > Run
  3. 选择 Java Application > ScientificCalculatorServer_server_com.ibm.dw.scicalc,如图 7 所示
  4. 单击 Run

图 7. 运行服务器
运行服务器

 

随后会运行服务器并告诉您它已经就绪。


图 8. 服务器就绪
服务器就绪

 

现在把浏览器指向 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService?wsdl,您应当会看到 WSDL。接下来,我们将使用 REST 在浏览器中测试 Web 服务。

使用 REST 进行测试

浏览器指向 Web 服务的 WSDL 后,您现在可以对它测试操作。将浏览器指向 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService/square?square0=4.5。

注意我们将调用 square 操作,其参数为 4.5。您将获得一个 soap+xml 类型的文件,它显示的结果为 20.25,如 SOAP 消息所示,它获得以下返回结果 。


清单 15. SOAP 消息响应
 
                    
<soap:Envelope
     xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <ns2:return xmlns:ns2="http://scicalc.dw.ibm.com/"
                xmlns="http://www.w3.org/2005/08/addressing/wsdl">
      20.25
    </ns2:return>
  </soap:Body>
</soap:Envelope>

 

您可以看到答案是 20.25。使用 REST 随便测试其他操作。接下来,我们将使用客户机执行一次回归测试。

通过运行客户机代码进行测试

现在,您知道服务已经启动并使用 REST 测试了功能,您可以使用客户机执行更严格且全面的测试。要运行客户机,请执行以下操作:

  1. 在 Navigator 视图中双击 Java 接口
  2. 单击 Run > Run
  3. 选择 Java Application > ScientificCalculatorClient_client_com.ibm.dw.scicalc
  4. 选择 Arguments 选项卡
  5. 用 http://localhost:8080/ScientificCalculator/services/ScientificCalculatorService?wsdl 替换 “Program arguments” 窗格,如图 9 所示
  6. 单击 Run

图 9. 配置客户机
配置客户机

 

单击 Run 后,客户机将运行并在控制台中执行每项操作,如下所示。


图 10. 执行客户机的结果
执行客户机的结果

 

通过切换到客户机的控制台,您可以看到客户机执行后得到的服务器输出,如下所示:


图 11. 服务器输出
服务器输出

 

成功啦!您有了一个功能全面的 Web 服务。接下来,我们将通过把 Web 服务部署到 Apache Tomcat 上执行一次最终测试。

在 Apache Tomcat 上部署和测试

开始在 Eclipse 内部设置 Tomcat 之前,您需要先把一些 jar 复制到 Tomcat 的 shared/lib 目录中,执行以下操作:将除 cxf-integration-jbi-*.jar(注:星号表示通配符)或用于本教程的 cxf-integration-jbi-2.0-incubator-RC-SNAPSHOT.jar 以外的所有 jar 从 CXF-Runtime-install-directory/lib 复制到 Tomcat-install-directory/shared/lib。

好的 —— 您已经准备好继续使用 Eclipse DTP 把软件包部署到 Tomcat 上。您将开始创建新的连接器(前四个步骤还可用于根据需要选择性启动 Eclipse 内的 Tomcat 服务器):

  1. 单击 File > New > Other
  2. 打开 Server 文件夹并选择 Server
  3. 选择 Apache 文件夹下的 Tomcat v5.5 Server
  4. 单击 Finish
  5. 现在单击 File > New > Other
  6. 打开 Connection Profiles 文件夹并选择 Connection Profile
  7. 选择 Tomcat Connection Profile
  8. 单击 Next
  9. 输入名称 Tomcat 5.5,然后单击 Next
  10. 浏览到 Tomcat 的安装目录(本教程中为 C:\apps\tomcat-5.5.20)
  11. 单击 Finish

要部署到 Tomcat 上,请运行 startup.bat (Windows®) 或 startup.sh (Linux®) 来启动 Tomcat 服务器。Tomcat 运行后,请通过以下操作部署 Web 服务:

  1. 在 Navigator 视图中选择 WAR 文件
  2. 右键单击并选择 Deploy,如下所示


    图 12. 服务器输出
    服务器输出

     
  3. 单击已建立的连接配置文件 Tomcat 5.5,并单击 OK
  4. 如果以前部署过,您将获得一条警告消息,如图 13 中所示。单击 OK


    图 13. 可以忽略的警告消息
    可以忽略的警告消息

     

现在像以前一样运行客户机,并且您应当会获得与图 10 所示完全相同的输出。Tomcat 的标准输出还应当会显示图 11 中所示的内容。

我们已经使用 Eclipse STP 插件成功地构建和测试了 Web 服务。

返回

结束语

是不是很简单?使用某些工具进行 Web 服务开发有时可能十分困难,但是幸好,比较而言这还是很容易完成的。我们为 Java 接口进行了注释,从生成客户机桩和服务桩的 Java 接口生成了 WSDL。然后定义了桩代码,成功地把服务部署到了 Eclipse 的独立服务器和 Tomcat 上,并使用客户机进行了测试。

但是等等,还有更多功能。Eclipse SOA Tools Platform (STP) 插件只是处于发展初期,并且一直以来都在不断添加更多功能。要了解关于它的更多信息,请查阅 参考资料。

返回

下载

描述 名字
大小
下载方法
源代码 os-eclipse-soatp.source.zip
39KB

返回

参考资料

学习

获得产品和技术 讨论

返回

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号