内容


在 Apache Geronimo 中部署 Web 服务

使用 Amazon Web 服务完成部署过程

Comments

Geronimo 支持 Web 服务标准

全新的 Apache Geronimo 项目是以一流的 J2EE 1.4 标准为基础而构建的功能强大的开源 J2EE 应用服务器。它使用各种开源实现,并且很快将与 J2EE 兼容。有趣的是,Geronimo 构建在从许多其他开源项目收集的代码集合基础之上。Geronimo 使用 Apache Axis 和 Apache Scout(请参阅 参考资料)支持以下 Web 服务标准:

  • Java Specification Request(JSR)109 (实现 Enterprise Web Services 1.1)
  • Java API for XML-based Remote Procedure Call (AX-RPC)
  • SOAP with Attachments API for Java (SAAJ)1.2
  • Java API for XML Registries(JAXR)1.0

当确定一台应用服务器来支持 Web 服务开发工作时,只有满足上述标准才能使 Geronimo 成为一种可行的方法。如果使用构成 Geronimo 的开源项目,则自然会将 Geronimo 转换为您的部署容器。要使 Geronimo 上的 J2EE 应用程序的开发和部署变得更容易,还要提供多个 Eclipse 插件。这些插件是 Eclipse Web Tools Platform(WTP)(2005 年 7 月将发布其 1.0 版本)的组成部分,请参阅 参考资料,以获得 WTP 及其相关信息的链接。

以 Amazon Web 服务(AWS)为例,学习如何使用 Web 服务和 Geronimo。从介绍使用用于 AWS 的 Web 服务描述语言(WSDL)和使用 Apache Axis 构建消费者代码开始,您将得到全程指导。了解使用 Web 服务的简单 Java 类,并学习如何从 JSP 文件调用这个类来显示 Web 服务的结果。最后,将这些代码绑定成 J2EE WAR 文件,并将其部署在 Geronimo 上。

使用 Amazon Web 服务

要使用 AWS,需要将 Apache Axis 用作 SOAP 实现来构建服务消费者(service consumer)。(Axis 是 Geronimo 支持的底层 SOAP 实现)。如果过去进行过这些操作并拥有此代码,那么可以跳过这一步骤。

生成 AWS 代码的要求

首先从设置环境开始。要生成 AWS 消费者代码,需要满足以下 4 项要求:

  • Java 软件开发工具包(JDK)1.4.2 或更新版本(请参阅 参考资料,以链接到 Java 网站)。
  • Apache Axis 1.1 或更新版本(请参阅 参考资料,以获得 Apache Axis 站点的链接)。
  • 用于 Web 服务的 Web 服务描述语言(WSDL)(请参阅 参考资料,以获得下载 WSDL 的链接)。
  • 来自 AmazonAn 的一个 AWS 订阅 ID,这样,就可以使用其 Web 服务(请参阅 参考资料,以获得免费注册 ID 的链接)。

设置环境

下载上面所列出的元素之后,接下来的一系列步骤将全程指导您设置环境,具体方法如下:

  • 将 JDK 安装到 C:\jdk_142_05。将 JAVA_HOME 设置到此目录。
  • 将 Apache Axis 解压缩到 C:\axis1-2,并将 AXIS_HOME 定义为此目录。
  • 将 WSDL 文件复制到 AXIS_HOME 目录。
  • 注册 AWS 订阅 ID。

基本环境准备好之后,就可以开始生成代码来使用 Web 服务了。

从 WSDL 生成 Java 代码

首先,从 WSDL 文件生成可以使用 Web 服务的 Java 代码。Apache Axis 附带一个称为 WSDL2Java 的实用工具,该工具可以执行此任务。要运行此工具,请确保类路径中存在以下 Java 存档(Java Archive,JAR)文件。清单 1 中所示的示例 setenv.bat 脚本可以做到这一点。

清单 1. Setenv.bat
set AXIS_HOME=c:\axis-1-2
set CLASSPATH=.
set CLASSPATH=%AXIS_HOME%\lib\axis.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\commons-discovery.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\commons-logging.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\jaxrpc.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\saaj.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\log4j-1.2.8.jar;%CLASSPATH%
set CLASSPATH=%AXIS_HOME%\lib\wsdl4j.jar;%CLASSPATH%

现在,可以从 AXIS_HOME 目录运行以下命令来生成 Java 代码:

java org.apache.axis.wsdl.WSDL2Java AWSECommerceService.wsdl

这此过程中,花费了几秒钟的时间在 AXIS_HOME 下创建一个称为 com 的目录。现在,可以开始创建一个 Web 存档(Web Archive,WAR)文件。该文件最后将部署在 Geronimo 上。

创建一个称为 C:\amazon-client 的目录。您将使用此目录存储 WAR 文件的代码。可以在此目录下创建一个称为 WEB-INF 的目录和一个称为 src 的目录。将 com 目录从 AXIS_HOME 复制到 C:\amazon-client\WEB-INF\src 中。

此代码是使用 Web 服务的基本代码。目前,您无需探究此代码的详细信息。

编写代码来使用 Web 服务

接下来便是编写连接 Web 服务的客户机。在此示例中,您将编写一个简单的 Java 类,该类可以调用通过 WSDL2Java 生成的适当类(像 Eclipse 和 IBM® Rational® Application Developer 这类的开发工具可以自动生成此代码的简写版。这样,就无需在编写此代码的细节上花费太多的时间)。

为简单起见,我们在同一软件包的结构中创建了一个称为 AmazonClient 的类,该结构由 WSDL2Java(com.amazon.xml.AWSECommerceServer)生成。此类的代码如 清单 2 所示。这个类公开了称为 lookupISBN 的单一方法。顾名思义,此方法会调用 AWS,并将传进的 ISBN 号所代表的图书信息返回。

清单 2. AmazonClient.java
package com.amazon.xml.AWSECommerceServer;
import java.lang.*; 
import java.util.*;
public class  AmazonClient {
    public AmazonClient() {    }
    public Items[] lookupISBN(String isbn) throws Exception {
        try {
            System.out.println("Given ISBN is " + isbn);
            AWSECommerceServiceLocator locator = 
                    new AWSECommerceServiceLocator(); 
            AWSECommerceServicePortType type = 
                    locator.getAWSECommerceServicePort(); 
            String itemId[] = {isbn.trim()}; 
            ItemLookup lookup = new ItemLookup(); 
            lookup.setAssociateTag("MY ID");   // fill in your own 
            lookup.setSubscriptionId("MY ID"); // fill in your own 
            ItemLookupRequest lookupReq = new ItemLookupRequest(); 
            lookupReq.setMerchantId("All"); 
            lookupReq.setItemId(itemId); 
            lookupReq.setResponseGroup(new String[] 
            {"Medium", "OfferFull", "Variations", "Images"}); 
            ItemLookupRequest[] requests = lookup.getRequest(); 
            requests = new ItemLookupRequest[1]; 
            requests[0] = lookupReq; 
            lookup.setRequest(requests); 
            ItemLookupResponse response = 
                     type.itemLookup(lookup); 
            Items[] items = response.getItems(); 
            if (items != null && items.length > 0) { 
                System.out.println("Number of results "+ items.length); 
                return items; 
            } 
        } catch (javax.xml.rpc.ServiceException se) { 
            throw new Exception(se.getMessage()); 
        } 
        return new Items[0]; 
    } 
}

必须向 Amazon 注册,以获得订阅 ID(请参阅上面的 使用 Amazon Web 服务)。获得订阅 ID 之后,可以用它替换 清单 2 代码中的 ID。

现在,您已经为编译此代码做好了准备。运行 setenv.bat 文件之后,通过运行 javac *.java: ,应该能够轻松地编译此代码。在这个目录中,可以获得多个类文件。为使包装更简洁,可以将整个 src 目录复制到一个称为 WEB-INF/classes 的新目录中,然后,从 WEB-INF/classes 删除所有 Java 源文件;从 WEB-INF/src 删除所有类文件。如果使用的是集成开发环境(IDE)(例如 Eclipse),则许多这类手动操作都可自动完成。

现在,可以调用 Web 服务并查看结果。使用 JSP 文件可以做到这一点。

编写 JSP 文件以便从 Web 服务显示结果

在 amazonclient 目录下,创建一个称为 searchAmazon.jsp 的 JSP 文件。该代码如 清单 3 所示。

清单 3 所示的 JSP 文件中,将调用您定义的 AmazonClient 类并接收一个 Item 对象数组。然后在这个数组上进行迭代便可以显示这些值。

现在您已具备所需的所有代码。

部署代码之前的最后步骤

最后一个步骤是设置部署描述符,以便在 Geronimo 上部署 WAR 文件。在 WEB-INF 目录下,创建两个简单的 XML 部署描述符。第一个是标准的 J2EE WAR 部署描述符,称为 web.xml (请参见清单 4)。

清单 4. web.xml
<?xml version="1.0"  encoding="ISO-8859-1" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    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_3.xsd"
    version="2.3">
 
  <display-name>Amazon Sample</display-name>
  <welcome-file-list>
      <welcome-file>t;searchAmazon.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Geronimo 需要一个 geronimo-jetty.xml 描述符。该代码如 清单 5 所示。

清单 5. geronimo-jetty.xml 描述符
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
xmlns="http://geronimo.apache.org/xml/ns/web/jetty"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming"
configId="amazonclient"
parentId="amazonClient">
   <context-root>/amazonclient</context-root>
   <context-priority-classloader>true</context-priority-classloader>
</web-app>

现在,您可将这个文件保存为 WAR 文件,并命名为 amazon.war。为此,请从 amazonclient 目录运行以下命令:

jar cf amazon.war

现在,您已经为在 Geronimo 上部署此代码做好了准备。

在 Geronimo 上部署消费者代码

构建标准 J2EE WAR 文件之后,就可以方便地在您所选择的任何应用服务器(或 servlet 引擎)上部署这个 WAR 文件。下面的部分将介绍如何在 Geronimo 上部署这个代码。

安装 Geronimo

首先下载并安装 Geronimo。(请参阅 参考资料,以链接到下载站点。)下载 Geronimo 1.0 M3 安装程序。要运行这个安装程序,请使用以下命令:

java -jar geronimo-1.0-M3-installer.jar

按照步骤操作,将 Geronimo 安装到 GERONIMO_HOME,并将它定义为 C:\geronimo。

启动 Geronimo

要启动服务器,请从 GERONIMO_HOME 目录运行以下命令:

java -jar bin/server.jar

部署 Amazon.war 文件

您应当在类路径中的 setenv 批处理文件中定义所有的 JAR 文件。将这些文件从 AXIS_HOME\lib 复制到 GERONIMO_HOME\lib 中。这些 JAR 文件大多数已经存在于 GERONIMO_HOME\lib 中。请不要覆盖这些已存在的文件,即使您正在复制的文件是同一文件的更新版本。当提示是否替换现有文件时,请单击 No

要在应用服务器上部署 amazon.war 文件,请将 WAR 文件复制到 GERONIMO_HOME 中,并从此目录运行以下命令:

java -jar bin/deployer.jar deploy amazon.war

运行 searchAmazon.jsp

剩下的最后一项任务是运行所编写的 JSP 文件。请打开浏览器,并在地址栏中键入 http://localhost:8080/amazon/searchAmazon.jsp

图 1 显示了该结果。您可以修改这个 JSP 文件,以包含一个表单字段,在该字段中输入 ISBN 编号并获得结果。

图 1. 执行 searchAmazon.jsp
searchAmazon.jsp
searchAmazon.jsp

现在您已经成功地在 Geronimo 中部署了第一个 Web 服务消费者。

标准 J2EE Web 服务

本文中的例子是非常简单的,但是它表明 Geronimo 支持标准 J2EE Web 服务。作为使用 Web 服务的练习,您可以尝试使用 AWS 提供的其他选项。例如,将 ISBN 搜索更改为标题搜索或作者搜索。然后,可以从 Web 服务结果中了解如何显示链接到 Amazon.com 的 URL 和该书的映像。

另一个有趣的练习是通过其他 J2EE 技术和 Apache Axis 来使用 Web 服务,然后将它们部署到 Geronimo 中。例如,将 AmazonClient.java Plain Old Java Object (POJO) 替换成无状态会话 Enterprise JavaBean (EJB) 组件,然后,将它部署到 Geronimo 中。

可以以 webMethods 或 Google Web 服务的任何 Web 服务作为例子。如果应用本文介绍的相同步骤,则可以快速地将一个服务消费者部署到 Geronimo 的这些 Web 服务中。

结束语

现在您已经认识了 Geronimo,并了解了它的 Web 服务功能,应该已经在 Web 服务开发工作中为开始使用 Geronimo 应用服务器做好了准备。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source, Java technology, SOA and web services
ArticleID=90844
ArticleTitle=在 Apache Geronimo 中部署 Web 服务
publish-date=07252005