IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Open source | Java technology | SOA and Web services  >

在 Apache Geronimo 中部署 Web 服务

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

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论


级别: 初级

Kunal Mittal (kunal@kunalmittal.com), Portal/J2EE 架构师,顾问

2005 年 7 月 25 日

要确定某个应用服务器是否支持 Web 服务开发工作吗?Apache Geronimo 应用服务器完全可以满足这一要求,它是 Apache Software Foundation 的最新项目之一。Java™ 专家 Kunal Mittal 将通过演示如何在 Geronimo 中编写和开发标准 J2EE Web 服务代码,向您介绍 Geronimo 的 Web 服务功能。您将学会如何根据底层简单对象访问协议(SOAP)实现使用 Apache Axis,从而使用 Amazon Web 服务,并且还将知道如何使用简单的、基于 JavaServer 页面的客户机来访问 Web 服务。

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 实现)。如果过去进行过这些操作并拥有此代码,那么可以跳过这一步骤。

撰写此文时,Geronimo 还不是一个产品级可用应用服务器,但是它将通过 J2EE 认证。在发布 Geronimo 时,它将是经认证的 J2EE 1.4。

生成 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 对象数组。然后在这个数组上进行迭代便可以显示这些值。

这里不是为了演示一个优秀的 J2EE 编码做法,而是示范正在编写的所有代码都是标准的 J2EE 代码,这些代码可以很容易地部署到 IBM WebSphere®、平台、 Apache Tomcat、Apache Geronimo、JBoss 或 BEA WebLogic 上。

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

部署代码之前的最后步骤

最后一个步骤是设置部署描述符,以便在 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

现在您已经成功地在 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 应用服务器做好了准备。



参考资料



关于作者

Kunal Mittal 是一名顾问,他精通 Java 技术、J2EE 和 Web 服务技术。他与别人合著了多本关于这些主题的书籍。Kunal 目前正致力于 Sony Pictures Entertainment 的门户项目。有关的更多信息,请访问他的网站,网址是:http://www.soaconsultant.com




对本文的评价










回页首


IBM, Rational, and WebSphere are registered trademarks of International Business Machines Corporation in the United States, other countries, or both. Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both. 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款