跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

在不使用 IDE 的情况下开发 Web 服务,第 2 部分: 在命令行上创建“Hello World”Web 服务客户机

Alec Go, 软件工程师 , IBM 
Alec Go 是 IBM WebSphere Application Server Level 2 Support 的一名软件工程师。他取得了宾夕法尼亚州立大学的计算机工程学士学位,并且以优异的成绩毕业。

简介: 本文将演示如何使用 WSDL2Java 命令创建简单的“Hello World”独立 Java 应用程序 Web 服务客户机。还将介绍如何使用 TCPMonitor 跟踪 HTTP 消息。

查看本系列更多内容

发布日期: 2006 年 5 月 08 日
级别: 中级
访问情况 : 1382 次浏览
评论: 


引言

本系列的第 1 部分重点讨论了如何从命令行创建 Web 服务提供程序。本文是我们的系列文章的第 2 部分,将介绍如何在不使用 WebSphere® Studio Application Developer (WSAD) 或 Rational® Application Developer (RAD) 集成开发环境 (IDE) 的情况下创建 Web 服务客户机。您将了解可以如何简单而轻松地完成 Web 服务客户机的创建工作。在此过程中,您将了解如何使用 Java™ 编译器和 WSDL2Java。本文还将通过 TCPMonitor 来演示如何跟踪 HTTP 消息。

本文假定您已具备以下先决条件:

  1. 基于 Windows 的操作系统
  2. 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 服务提供程序已正确启动,现在就可以开始创建客户机了。以下是三个基本步骤:

  1. 从 WSDL 创建客户机存根
  2. 开发使用这些存根的 Java 类
  3. 编译 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 中的值
设置 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 输出
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 sideHelloWorld.war6KBHTTP
Hello World WSDL fileHelloWorld.wsdl3KBHTTP
Script to build the client automaticallyWebServiceTutorial.bat1KBHTTP
Final codeFinish.zip14KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

讨论

关于作者

Alec Go 是 IBM WebSphere Application Server Level 2 Support 的一名软件工程师。他取得了宾夕法尼亚州立大学的计算机工程学士学位,并且以优异的成绩毕业。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and Web services, WebSphere
ArticleID=331703
ArticleTitle=在不使用 IDE 的情况下开发 Web 服务,第 2 部分: 在命令行上创建“Hello World”Web 服务客户机
publish-date=05082006
author1-email=
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。