级别: 初级 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 目录运行以下命令:
现在,您已经为在 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 目录运行以下命令:
部署 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
现在您已经成功地在 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。 |
对本文的评价
|