级别: 中级 Alec Go, 软件工程师 , IBM
2006 年 5 月 08 日 本文将演示如何使用 WSDL2Java 命令创建简单的“Hello World”独立 Java 应用程序 Web 服务客户机。还将介绍如何使用 TCPMonitor 跟踪 HTTP 消息。
引言
本系列的第 1 部分重点讨论了如何从命令行创建 Web 服务提供程序。本文是我们的系列文章的第 2 部分,将介绍如何在不使用 WebSphere® Studio Application Developer (WSAD) 或 Rational® Application Developer (RAD) 集成开发环境 (IDE) 的情况下创建 Web 服务客户机。您将了解可以如何简单而轻松地完成 Web 服务客户机的创建工作。在此过程中,您将了解如何使用 Java™ 编译器和 WSDL2Java。本文还将通过 TCPMonitor 来演示如何跟踪 HTTP 消息。
本文假定您已具备以下先决条件:
- 基于 Windows 的操作系统
- WebSphere Application Server 5.x 或 6.x。请下载试用版,以便按照本文所述进行操作。
准备工作
如果您尚未阅读第 1 部分的内容并进行相应的操作,请通过使用 WebSphere Application Server 管理控制台安装下载部分提供的 WAR 文件。如果已进行了第 1 部分的操作并安装了该 WAR 文件,则请跳过此步骤。要安装 WAR 文件,请按照以下步骤进行操作:
转到 Applications -> Enterprise Applications -> Install。将 Local Path 指定为 HelloWorld.war 的位置,而将 Context Root 指定为 HelloWorldWAR。
图 1. 管理控制台视图
首次创建 WSDL 文件时,location 参数设置为“http://localhost:9080/HelloWorldWAR/services/HelloWorld”。因此,Context Root 必须为“HelloWorldWAR”,以便可以将 WSDL 文件用于生成客户机,而无需进行手动更改。
单击 Next,以接受所有缺省设置。完成安装 WAR。请记住保存所有更改。现在最重要的一步是启动该 WAR 文件——这一步非常容易被遗忘!
创建客户机
假定 Web 服务提供程序已正确启动,现在就可以开始创建客户机了。以下是三个基本步骤:
- 从 WSDL 创建客户机存根
- 开发使用这些存根的 Java 类
- 编译 Java 文件并运行客户机
从 WSDL 创建客户机存根
Web 服务编程模型的优势在于,可以非常方便地调用远程方法。WSDL 用于创建存根,而后者可以随后用于表示客户端的远程对象:
A) 创建一个目录 (c:\temp\Client)。复制在第 1 部分创建的 HelloWorld.wsdl(或从下载部分下载)。
B) 打开命令提示符,并定位到 c:\temp\Client。键入以下命令:
清单 1. 设置命令行提示符
SET WAS_HOME=C:\Program Files\WebSphere\AppServer5.1
call "%WAS_HOME%\bin\setupcmdline.bat"
|
第一行将“WAS_HOME”环境变量设置为安装 WebSphere Application Server 的位置。请确保该变量指向了正确的目录!第二行调用一个脚本,以设置其他环境变量,如 JAVA_HOME。
C) 使用 WSDL2Java 目录创建客户机存根:
清单 2. 运行 WSDL2Java
call "%WAS_HOME%\bin\WSDL2Java" -role client -verbose -output . HelloWorld.wsdl
|
以下是对所使用的选项的说明:
- Role——可以用于指定服务器或客户机。我们选择后者,因为正在构建客户机。
- Verbose——这会将所进行的每个步骤的消息输出到控制台
- Output——我们用一个句点来指定当前目录
- WSDL file——这始终是最后一个参数
运行此命令后,将在控制台显示以下内容:
清单 3. WSDL2Java 的输出
WSWS3185I: Info: Parsing XML file: HelloWorld.wsdl
WSWS3282I: Info: Generating .\mypackage\HelloWorld.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.
|
您会注意到,将与上述文件一起创建一个名为 mypackage 的目录。下面是关于这些文件的更为详细的信息:
- HelloWorld.java——这是服务端点接口
- HelloWorldSoapBindingStub.java——这是服务端点接口的一个实现
- HelloWorldService.java——这是服务接口
- HelloWorldServiceLocator.java ——这是服务接口的实现
要记住的概念有:
- 服务端点接口:HelloWorldSoapBindingStub 实现 HelloWorld
- 服务接口:HelloWorldServiceLocator 实现 HelloWorldService
您将在下一部分构建客户机时了解关于这些概念的更多信息。
开发使用存根的 Java 类
下一步是创建一个可以利用所生成的存根的类文件。在“mypackage”目录中创建一个名为 HelloWorldClient.java 的文件。将以下代码粘贴到其中:
清单 4. HelloWorldClient.java
package mypackage;
public class HelloWorldClient {
public static void main(String[] args) throws Exception
{
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
HelloWorld hw = hwlocator.getHelloWorld();
String str = hw.sayHello();
System.out.println(str);
}
}
|
请注意,仅使用了三行代码来调用 Web 服务。以下是相关说明:
A) HelloWorldServiceLocator 是一个 Service 对象。简而言之,Service 对象用于获取生成的存根。Service 对象是由下面这行代码创建的:
清单 5. 创建 HelloWorldServiceLocator
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
|
Service 对象的名称将始终为 *service name*Locator,其中 *service name* 是 WSDL 文件中的服务的名称。
注意:在 J2EE 上下文中(在 Servlet 或 EJB 内),Service 对象应通过 JNDI 进行检索。由于我们使用的是 J2SE 客户机,因此这是检索 Service 对象的唯一办法。
B) 接下来需要创建客户机存根。存根表示远程对象。可通过以下代码获得存根:
清单 6. 获得存根
HelloWorld hw = hwlocator.getHelloWorld();
|
请注意,用于获取端口的方法将始终名为 get*port name*,其中 *port name* 是 WDSL 文件中的端口名称。
C) 最后,可以对存根调用远程方法。在这里,我们对存根使用 sayHello 方法,并将返回值放入字符串中:
清单 7. 对存根调用方法
String str = hw.sayHello();
|
编译并运行客户机
下一步是实际编译客户机。发出以下命令,以进行编译:
清单 8. 编译类
"%JAVA_HOME%\bin\javac" -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java
|
类文件应该出现在 mypackage 目录中。最后,运行 Java 应用程序:
清单 9. 运行 Java 应用程序
"%JAVA_HOME%\bin\java"
-Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient
|
应该在控制台中显示“Hello World!”消息。祝贺您!您已经通过您的客户机调用了该 Web 服务。
设置 TCPMonitor 跟踪
我们还可以进行一项额外的操作,以检查通过网络传输的数据。WebSphere Application Server 提供了一个名为 TCPMonitor 工具,允许用户对 HTTP 消息进行跟踪。为了使用 TCPMonitor,我们将其放置在客户机和服务器之间。客户机当前直接与服务器进行交互。我们会将客户机定向到与 TCPMonitor 进行交互,而 TCPMonitor 会将通信数据转发给服务器。
A) 为了利用 TCPMonitor,我们首先必须对客户机进行修改。编辑 HelloWorldClient.java,使其与以下所示内容类似:
清单 10. HelloWorldClient.java
package mypackage;
import javax.xml.rpc.Stub;
public class HelloWorldClient {
public static void main(String[] args) throws Exception
{
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();
HelloWorld hw = hwlocator.getHelloWorld();
((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address",
"http://localhost:1234/HelloWorldWAR/services/HelloWorld");
System.out.println(hw.sayHello());
}
}
|
添加了 ((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address", "http://localhost:1234/HelloWorldWAR/services/HelloWorld"); 行,以将端点更改为客户机将用来发送通信数据的目标端点。在 HelloWorldServiceLocator.java 文件中通过以下代码行指定缺省端点地址:private final java.lang.String helloWorld_address = "http://localhost:9080/HelloWorldWAR/services/HelloWorld";
请注意,我们将端口从 9080 改为了 1234。此外,我们必须导入 java.xml.rpc.Stub 类,以将 HelloWorld 实例强制转换为 Stub 对象。
B) 运行 TCPMonitor 时,务必使用与 WebSphere Application Server 对应的 Java 版本。否则,可能会接收到一个 NullPointerException。发出以下命令:
清单 11. 运行 TCPMon
"%JAVA_HOME%" -Djava.ext.dirs="%WAS_EXT_DIRS%" com.ibm.ws.webservices.engine.utils.tcpmon
|
C) 指定下列值:
清单 12. TCPMon 中的值
Listen Port - 1234
Target Hostname - localhost
Target Port # - 9080
|
其窗口应与以下所示内容类似:
图 2. 设置 TCPMonitor 中的值
接下来,单击 Add 按钮。这将配置 TCPMonitor 接收端口 1234 上的通信数据,并将其重定向到 9080。单击了 Add 按钮后,侦听器将自动运行。在 TCPMonitor 的顶部,将出现表示侦听器的选项卡。
D) 通过以下命令重新编译并调用 Web 服务:
清单 13. 运行 HelloWorldClient
"%JAVA_HOME%\bin\javac"
-extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java
"%JAVA_HOME%\bin\java"
-Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient
|
E) 在 TCPMonitor 窗口中检查通信数据。SOAP 信封的内容将全部显示在一行中。Web 服务引擎为了节省空间,将避免发送换行字符。
图 3. TCPMonitor 输出
F) 为了使该 XML 更易于阅读,可以创建一个名为 tcptrace.xml 的新文件,并将该 XML 中的内容粘贴到其中。然后,可以使用 Mozilla Firefox 或 Microsoft Internet Explorer 打开该 XML 文件,以便查看应用了相应格式的内容。
结束语
通过 Web 服务编程模型可以方便地生成存根,然后由客户机应用程序将其用于调用 Web 服务。目前,可以采用这里描述的技术来为很多 Web 服务构建客户机。Google、Amazon、Ebay 和 Fedex 等主要站点当前都提供您可以使用的 Web 服务。去享受其中的乐趣吧!
附录 A:自动构建客户机
可以通过使用下载部分提供的 WebServiceTutorial.bat 来自动执行上述步骤。首先,对 WebServiceTutorial.bat 进行修改,以使 WAS_HOME 目录指向当前的 WAS 安装目录。接下来,运行该批处理文件。其输出应与以下所示内容类似:
清单 14. WebServiceTutorial.bat 的输出
1. Creating Binding Classes...
WSWS3185I: Info: Parsing XML file: HelloWorld.wsdl
WSWS3282I: Info: Generating .\mypackage\HelloWorld.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.
WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.
2. Compiling Java Client...
3. Running Java Client...
Hello World!
|
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Hello World WAR file to install on server side | HelloWorld.war | 6KB | HTTP |
|---|
| Hello World WSDL file | HelloWorld.wsdl | 3KB | HTTP |
|---|
| Script to build the client automatically | WebServiceTutorial.bat | 1KB | HTTP |
|---|
| Final code | Finish.zip | 14KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Alec Go 是 IBM WebSphere Application Server Level 2 Support 的一名软件工程师。他取得了宾夕法尼亚州立大学的计算机工程学士学位,并且以优异的成绩毕业。 |
对本文的评价
|