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

developerWorks 中国  >  SOA and Web services | WebSphere  >

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

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

讨论

样例代码


级别: 中级

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 消息。

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

  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 的一名软件工程师。他取得了宾夕法尼亚州立大学的计算机工程学士学位,并且以优异的成绩毕业。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

将您的建议发给我们或者通过参加讨论与其他人分享您的想法.







回页首


Java 和所有基于 Java 的商标都是 Sun Microsystems, Inc. 在美国和/或其他国家的商标。 其他公司、产品或服务的名称可能是其他公司的商标或服务标志。

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