级别: 初级 Sheldon Wosnick, 软件开发者, IBM WebSphere Studio Application Developer, IBM Toronto Lab
2002 年 5 月 01 日 本文带您历验在 IBM WebSphere Studio Application Developer 中创建和运行一个 EJB Web 服务的必需步骤;它还将讨论怎样从使用 Microsoft? .NET?- Framework SDK 创建的一些基本的应用程序客户机调用 Web 服务。
© Copyright International Business Machines Corporation 2002. All rights reserved.
介绍
本教程带您历验在IBM WebSphere® Studio Application Developer
中创建和运行一个 EJB Web 服务的必需步骤;它还将讨论怎样从使用 Microsoft® .NET®- Framework SDK 创建的一些基本的应用程序客户机调用 Web 服务。我将讲解怎样生成 Web 服务描述语言(WSDL)代理,这些代理供那些用 C# 和 JScript 编程语言写的 Microsoft .NET 客户机使用,目前 Microsoft .NET Framework 支持这两种语言。请注意,C#(发音为“C sharp”)是类似于 Java 和 C/C++ 的新的 Microsoft 编程语言。我还将向您说明怎样把用两种语言创建的代理合并为单个可执行程序。您在 Application Developer 中开发和测试 EJB 和 Web 服务之后,我将向您说明怎样创建和运行简单的基于控制台的 Microsoft .NET 应用程序以及用 C# 编写的基于图形的应用程序。
本教程没有讲述开发 Java、Web 服务或 J2EE 应用程序的细节。相反,这篇教程的目的仅仅是为了讲解互操作性是可能的。我将不会深入到关于 Microsoft .NET Framework 的众多细节中,因为您自己可以在
Microsoft MSDN Web 站点轻松地阅读到这些内容。请参阅我的前两篇教程,这两篇教程带您历验了在 Application Developer 中创建和单元测试 J2EE 应用程序的详细过程。第一篇教程,
Developing and Testing a Complete "Hello World" J2EE Application with WebSphere Studio Application Developer,向您说明了怎样创建和测试 EJB。第二篇教程,
Developing and Testing a Complete J2EE Application with WebSphere Studio Application Developer -- Part 2: Running on WebSphere Application Server,向您说明了怎样在 WebSphere Application Server 上部署和测试一个 J2EE 应用程序。请不要把我的样本代码认为是编写 Web 服务的某种蓝本或指示;我的简单的样本代码并没有为最小化网络通信量而做优化,而这才是真正的 Web 服务需要做到的。我的目的只是要讲解 J2EE 与 WebSphere Application Server 和 Microsoft .NET 所涉及的基本的互操作性。
要开始学习,您需要什么
您需要 WebSphere Studio Application Developer 4.0x(即使是试用版也行)和 Microsoft .NET Framework SDK。如果您有 Microsoft Visual Studio® .NET,那么您可以完成同样的步骤,但是我所讲解的每个步骤都能用 Application Developer 4.0x 和 Microsoft .NET Framework SDK(可从 Microsoft 免费得到)来完成。
我这里的目的是为了说明对开放的基于 Web 的协议的行业支持(以及使这些协议成为标准背后所付出的努力),如 HTTP、SOAP、WSDL 和 J2EE 是使在 Microsoft .NET Framework 中运行的客户机执行在 Application Developer 的 WebSphere 测试服务器中运行的 Web 服务/J2EE 应用程序成为可能的根本所在。您创建的 EJB、Web 服务以及客户机非常简单,来回流经的对象类型是基本、简单的类型,但是这个练习将用来证明这种跨框架的互操作性在异类环境中不仅是可能的,而且是必需的。我希望这将是更复杂的交互的出发点。
所有源代码、脚本以及命令的清单可以在本文提供的下载文件中的
all listings.txt 中得到。
您将完成的步骤
在本教程中,您将完成下面这些任务:
-
写一个无状态会话 EJB
-
创建一个 Web 工程
-
给会话 EJB 创建一个 EJB Web 服务
-
使用所生成的样本测试 EJB Web 服务(由此测试 EJB)
-
生成 EJB Web 服务的 Microsoft .NET WSDL 代理
-
编译 EJB Web 服务的 Microsoft .NET WSDL 代理
-
创建、编译并执行一个简单的基于控制台的 Microsoft .NET 客户机
-
创建、编译并执行一个基于图形的 Microsoft .NET 客户机
开发 EJB、Web 服务以及 Microsoft .NET 客户机应用程序本质上有八个开发步骤。这些步骤描述了要开始写调用在 WebSphere Studio Application Developer 的单元测试服务器中运行的 Web 服务的 Microsoft .NET 应用程序客户机,您需要什么。我将更集中在这种互操作性方案的客户机端,而不是服务器端(我在其它地方已经讨论过了)。要获取关于开发和测试简单的端到端 J2EE 应用程序的介绍性教程,请参考我早些时候的两篇教程(请参阅
参考资料)。
“额外内容”部分讲解了怎样创建一个与您开发的 J2EE Web 服务进行通信的 ASP.NET Web 服务。由于这两个 Web 服务其实是相互协作来完成一个特定的任务,因此这一部分进一步展示了“协同操作应用程序”的前景。
包含 J2EE EJB 和 Web 服务的 EAR 模块可以在下载文件中得到,因此如果您愿意,您可以导入现有的样本。
通篇教程将大量使用抓屏,以准确地为您说明这个过程固有的要求,确保您知道选择什么来得到所希望的结果。所有的应用程序组件都在 Windows® 2000 和 Windows XP 上开发和测试。通篇的抓屏都用的是 Windows XP。
第 1 步. 写一个无状态会话 EJB
在第一步中,您将创建一个简单的会话 EJB,这个 EJB 将用来包装 EJB Web 服务。因为在目前,使用 Application Developer,只有无状态会话 EJB 能做成 Web 服务,所以我将讲解怎样创建和使用一个简单的无状态会话 bean。
- 在 J2EE 透视图,使用 EJB Project Creation 向导在缺省的 EAR 模块中创建一个叫做
HelloWorldEJB的 EJB 工程。接受其它的缺省值,然后单击
Finish。
- 选择
HelloWorldEJB工程(已经缺省地被选中),然后以您选择的包名创建一个叫做
HelloWorld的新的会话 EJB(
New => EnterpriseBean)。
图 1. 创建一个简单的 HelloWorld 会话 bean
- 将下面三个“业务”方法添加到 HelloWorldBean 中,然后将它们提升到远程接口。您可以随意将这个实现的返回字符串改为您所感兴趣的字符串(万一您不愿使用我的名字)。这个小片断,请参阅清单 1。
public String sayHelloWorld1() {
return "Hello World from Sheldon";
}
public String sayHelloWorld2(String name) {
return "Hello World to " + name + " from Sheldon";
}
public String sayHelloWorld3(String name, int age) {
return "Hello World " + name + " from Sheldon. You're " +
age + " years old!";
}
|
- 鼠标右键单击这个 EJB 工程,然后从弹出菜单选择
Generate deploy and RMIC
code。当提示出现时,请选择
HelloWorld复选框。
第 2 步. 创建一个 Web 工程
在这一步,您将创建 Web 工程,它将包含您下一个开发步骤中创建的 EJB Web 服务。
- 在 J2EE 透视图,选择
New => Web Project,然后使用 Create Web Project 向导在缺省的 EAR 模块中创建一个叫做
HelloWorldWeb的 Web 工程。
- 将这个 Web 应用程序的上下文根设置为
HelloWorld 。
- 单击
Finish。
第 3 步. 创建一个 EJB Web 服务
在这一步,您将逐页经历易于使用的 Web 服务创建向导,该向导为您完成创建 EJB 包装的 Web 服务和样本测试客户机应用程序的所有底层工作。
- 在 Web 透视图,选择
New => Web Service,然后使用 Web Service 向导来创建新的 EJB Web 服务,您将用这个 EJB Web 服务来生成一个代理和一个样本应用程序,并创建所有必需的文件夹。
- 根据下图,选择或清除复选框。如果您愿意,您可以选择
Launch the sample复选框,而我这里没有这样做,因此您将在后面的场合知道怎样启动它。
图 2. 创建一个 EJB Web 服务
- 单击
Next,然后单击
Browse EJB Beans按钮来浏览 EJB bean。选择 HelloWorld bean。条目应该看起来类似于下面的图 3。
图 3. 将 EJB 作为 Web 服务配置
- 继续操作向导的页面,并且接受所有的缺省值。请
不要选择
use secure SOAP复选框。
图 4. 接受缺省值 ? 让“use secure SOAP”留着不选。
- 接受所有三个要公开和部署的 EJB 远程方法的缺省值。接受所有其它使用 SOAP 编码的缺省值。
图 5. 指定 EJB Web 服务方法的所有公开的 EJB 方法
- 同样,接受绑定代理生成页上的缺省值。再次强调,请
不要选择
use secure SOAP (WebSphere only)复选框。使用 SOAP 安全超出了本教程的范围,这样做的话将会偏离我的使问题尽可能简单的目标。
图 6. 使用预先选中的 SOAP 绑定
- 单击
Finish。
第 4 步. 测试 EJB Web 服务
在上一步中,当您创建 EJB Web 服务时,您选择了向导中的
Generate a sample复选框。这生成一个样本 JSP 页,它实际上是一个 Web 服务测试客户机,因为它使您能够调用自己的 Web 服务中的方法,提供参数以及观察发回的结果值。
- 选择所提供的 Web 服务
TestClient.jsp 应用程序,然后选择
Run on Server。WebSphere 服务器应该已经自动地被配置并启动,而且嵌入式的 Web 浏览器应该自动启动,设置为正确的 Web 地址。为了在 Navigator 视图中这样做,您应该像图 7 所描绘的那样进行设置。
图 7. 执行 Web 服务测试客户机样本的“Run on Server”
请注意,如果上面的向导(请参阅上面的图 2)中的
Launch the Sample复选框被选中,那么这里所列出的第 2 步和第 3 步可以合并成一步。如果用户需要重复向导所有的步骤,那么他们需要选择
Overwrite files without warning复选框,因为代码需要重新生成。
- 请试验被公开的所有三个 EJB 方法 ? 所有三个版本的
sayHelloWorld() 方法。如果您能够成功地调用它们并获得所期望的返回值,那么这意味着您所创建的 EJB 和 Web 服务都在正常地工作。下面的图 8 说明了调用带有一个单字符串参数的
sayHelloWorld2() 方法。我传递了字符串“Jane”作为参数,以供使用,然后单击了
Invoke。
图 8. 调用所生成的 JSP 样本中的方法
第 5 步. 生成 EJB Web 服务的 Microsoft .NET WSDL 代理
- 在命令行使用 Microsoft Web Services Description Language Utility(
wsdl.exe )来生成面向 C# 和 JScript 两种语言的代理。请确保运行 Web 服务和 EJB 的 WebSphere 服务器实际正在运行。针对所生成的代理,下面的内容描述了 C# 和 JScript 两种类型,但是您不是两种都需要(除非您想尝试一下)。虽然这个工程只使用 C# 和 JScript 来进行测试,但是我讲解这两者是为了说明这是合理的:即,假设使用以任何被支持的 .NET 语言生成的代理的任何 .NET 客户机,在此都应该可以工作。
- 对于 JScript 代理,在您想要工作的目录发出下面这些命令:
wsdl /nologo /language:JS /out:HelloWorld-binding.jscript
/namespace:SBW.J2EE.HelloWorld
http://localhost:8080/HelloWorld/wsdl/HelloWorld-binding.wsdl
wsdl /nologo /language:JS /out:HelloWorld-service.jscript
/namespace:SBW.J2EE.HelloWorld
http://localhost:8080/HelloWorld/wsdl/HelloWorld-service.wsdl
|
- 对于 C# 代理,在您想要工作的目录发出下面这些命令:
wsdl /nologo /language:CS /out:HelloWorld-binding.cs
/namespace:SBW.J2EE.HelloWorld
http://localhost:8080/HelloWorld/wsdl/HelloWorld-binding.wsdl
wsdl /nologo /language:CS /out:HelloWorld-service.cs
/namespace:SBW.J2EE.HelloWorld
http://localhost:8080/HelloWorld/wsdl/HelloWorld-service.wsdl
|
一旦您完成了上面的第 2 步和/或第 3 步,您将生成
out 参数所指定的一个服务和一个绑定源文件。
第 6 步. 编译 EJB Web 服务的 Microsoft .NET WSDL 代理
- 对于 JScript 代理,在生成的代理所在的目录,发出下面这些使用 Jscript.NET 编译器的命令:
jsc /nologo /out:HelloWorld-binding-jscript.dll
/r:Microsoft.JScript.dll
/target:library HelloWorld-binding.jscript
jsc /nologo /out:HelloWorld-service-jscript.dll
/r:Microsoft.JScript.dll
/target:library HelloWorld-service.jscript
|
- 对于 C# 代理,在生成的代理所在的目录,发出下面这些使用 C#.NET 编译器的命令:
csc /nologo /out:HelloWorld-binding-csharp.dll
/target:library HelloWorld-binding.cs
CSC /nologo /out:HelloWorld-service-csharp.dll
/target:library HelloWorld-service.cs
|
- 一旦上面的第 1 步和第 2 步完成,您将找到创建和编译的 C# 或 JScript 文件,如下所示:
第 7 步. 创建、编译并执行一个简单的基于控制台的 Microsoft .NET 客户机
通过输入下面的代码,然后编译并运行它,创建一个简单的无修饰控制台风格的应用程序。
1. 对于一个简单的客户机,使用任意一种文本编辑器来创建一个叫做
SimpleWebServicesClient.cs 的新的 C# 源文件,它包含下面这些代码行:
using System; using SBW.J2EE.HelloWorld;
public class SimpleWebServicesClient {
public static void Main() {
HelloWorldService proxy = new HelloWorldService();
Console.WriteLine("Invoking EJB methods through the proxy.");
string message = null;
try {
message = proxy.sayHelloWorld1();
WriteMessage(message);
message = proxy.sayHelloWorld2("John");
WriteMessage(message);
message = proxy.sayHelloWorld3("Jane", 29);
WriteMessage(message);
}
catch (Exception e)
{Console.WriteLine("Threw general exception: {0}", e);}
}
private static void WriteMessage(string message) {
Console.WriteLine("Server returns: {0}", message);
}
}
|
至于完整的源代码,请参阅清单 6。
2. 为了编译和链接,使用我们所构建的 JScript 库,在命令行输入下面这些命令:
CSC /nologo /out:SimpleWebServicesClient.exe
/r:Microsoft.JScript.dll /r:HelloWorld-binding-jscript.dll
/r:HelloWorld-service-jscript.dll SimpleWebServicesClient.cs
|
为了使用 C#
库构建一个类似的可执行文件,请输入:
CSC /nologo /out:SimpleWebServicesClient.exe
/r:HelloWorld-binding-csharp.dll
/r:HelloWorld-service-csharp.dll SimpleWebServicesClient.cs
|
3. 在构建
SimpleWebServices.exe 可执行文件(使用 JScript 或 C# 库)之后,在确保 Application Developer 中的 WebShphere 服务器实例正在运行的情况下,在带有库的目录下,从命令行运行它。如果到此为止您已经正确地完成了所有的步骤,那么您应该看到显示在控制台中的下面这些输出:
C:\tutorial>SimpleWebServicesClient
Invoking EJB methods through the proxy.
Server returns: Hello World from Sheldon!
Server returns: Hello World to John from Sheldon!
Server returns: Hello World Jane from Sheldon.
You're 29 years old!
|
如果您愿意,您可以运行所提供的
build-run-csharp.bat 或
build-run-jscript.bat 文件。这样做将创建并编译代理,构建客户机应用程序,并一步执行它。
第 8 步. 创建、编译并执行一个基于图形的 Microsoft .NET 客户机
为了开发面向 Microsoft .NET 平台的更复杂的、基于图形的 Windows 应用程序客户机,请按照下面这些步骤执行。您将构造一个具有简单控件和事件处理程序的简式窗口,这些简单控件和事件处理程序使输入姓名和年龄,然后调用服务成为可能。我们添加了一些逻辑,如果没有提交姓名和年龄(或者只有年龄没有姓名),则调用第一个 EJB 方法;如果只提交了姓名,则调用第二个 EJB 方法;如果姓名和年龄都提交了,则调用第三个 EJB 方法。这将完成将 Microsoft .NET 客户机前端展示给我们所开发的 J2EE 服务器后端的整个过程。
- 通过输入下面这些代码并对其进行编译,创建一个基于图形的 Microsoft.NET 应用程序。至于完整的清单,请参阅清单 11,此处没有重写出来。
...
public class WindowsWebServicesClient : Form {
...
// Event handler implementation
private void button_Click(object sender, EventArgs evArgs) {
System.Console.WriteLine("Invoking the HelloWorld EJB
Web service...");
string message = null;
int age = 0;
if(firstNameTextBox.Text == "" && ageTextBox.Text == "")
message = proxy.sayHelloWorld1();
else if(firstNameTextBox.Text != "" && ageTextBox.Text == "") {
message = proxy.sayHelloWorld2(firstNameTextBox.Text);
}
else if(firstNameTextBox.Text != "" && ageTextBox.Text != "") {
// no type checking in this simple example.
// Only enter integers.
age = Convert.ToInt32(ageTextBox.Text);
message = proxy.sayHelloWorld3(firstNameTextBox.Text, age);
}
else
message = "If you enter an age, you must enter a name.
Try again.";
// display back the results
messageTextBox.Text = message;
}
}
|
- 像上面您所做的那样编译它,如下所示:
JScript:
CSC /nologo /out:WindowsWebServicesClient.exe
/r:Microsoft.JScript.dll /r:HelloWorld-binding-jscript.dll
/r:HelloWorld-service-jscript.dll WindowsWebServicesClient.cs
|
C#:
CSC /nologo /out:WindowsWebServicesClient.exe
/r:HelloWorld-binding-csharp.dll
/r:HelloWorld-service-csharp.dll WindowsWebServicesClient.cs
|
- 运行这个应用程序。基于上面的简单逻辑(这个逻辑管理调用三个 EJB 方法中的哪一个),您应该看到类似于下面的图 9 的响应。
图 9. 无参数调用 Web 服务
图 10. 将参数传递给“name”调用 Web 服务
图 11. 将参数传递给“name”和“age”调用 Web 服务

 |

|
“额外内容”部分
如果您想要了解下一个逻辑步骤,即 Web 服务对 Web 服务、机器对机器,请试一试这些步骤。这些步骤说明了怎样设置一个用 C# 编写的,并部署到 NET. Framework 的简单的 ASP.NET Web 服务,它和在 Application Developer 测试服务器中运行的 EJB Web 服务进行对话。虽然两组 Web 服务都在一个物理机上运行,但是出于各种意图和目的,我们仍然要将其考虑为机器对机器的情况。虽然它们都在极其不同的编程和组件模型中运行,但是它们仍然能够比较无缝地与对方进行对话。
第 1 步. 用 C# 写一个 ASP.NET Web 服务
- 使用任何一种纯文本编辑器,在您生成和编译代理和应用程序客户机的目录中创建一个新文件,然后命名为:
HelloWorld.NETWebService.asmx 。
- 这个 Web 服务将公开三个方法,它依次调用在 Application Developer 的 WebSphere Application Server 单元测试环境内运行的 Web 服务中的三个方法。在您输完文本之后,请保存您的
ASP.NET 文件。
<%@ WebService Language="C#" Class="HelloWorldNETWebService" %>
using System.Web.Services;
using SBW.J2EE.HelloWorld;
public class HelloWorldNETWebService : WebService {
HelloWorldService proxy = new HelloWorldService();
string message = null;
[WebMethod]
public string SayHelloWorld1() {
message = proxy.sayHelloWorld1();
return message;
}
[WebMethod]
public string SayHelloWorld2(string firstName) {
message = proxy.sayHelloWorld2(firstName);
return message;
}
[WebMethod]
public string SayHelloWorld3(string firstName, int age) {
message = proxy.sayHelloWorld3(firstName, age);
return message;
}
}
|
至于完整的清单,请参阅清单 12。
第 2 步. 给 Internet Information Server 设置一个作为虚拟目录的共享文件夹
使用您创建和编辑ASP.NET文件的物理目录作为虚拟目录比较简单,Microsoft Internet Information Server(IIS)可以使用这个虚拟目录,而不用四处移动您的任何源文件。在我的示例中,我在
c:\tutorial 中进行所有的开发工作,因此这是我启用为
Web Sharing的目录。然而,任何目录都可以。
1. 通过鼠标右键单击目录,转到
Properties,然后单击
Web Sharing选项卡,共享 IIS 的文件夹。
图 12. 将工作目录作为虚拟目录共享
2. 在这个虚拟目录映射的目录下创建一个叫做
\Bin 的子目录,在这里放置 C# 版本的 DLL。请参阅前面的第 6 步。换句话说,构建:
Bin\HelloWorld-binding-csharp.dll
Bin\HelloWorld-service-csharp.dll
|
这个重要步骤使所编译的 ASP.NET 能够定位和装入它所依赖的类。
第 3. 运行 ASP.NET Web 服务
1. 确保启动了 IIS 服务(以及 Application Developer 中的 WebSphere 服务器正在运行),然后打开浏览器到:
http://localhost/HelloWorld/HelloWorldNETWebService.asmx。
2. 启动这个 URL 给您一个生成的测试客户机,它在针对该 Web 服务的 IIS 中运行。它还让您将“服务描述”作为 WSDL 查看。
图 13. 查看所支持的可用的三个操作中的两个操作
这清楚地演示了“协作性应用程序”的一个简单例子,这些应用程序一起工作,就象是一个应用程序,虽然它们在两个完全不同的平台上开发 ? Microsoft .NET 和 J2EE ? 使用类似的、标准化的 Web 服务技术。请单击
SayHelloWorld2操作,然后输入姓名参数字符串值。
图 14. 测试 ASP.NET Web 服务对 J2EE Web 服务
在 ASP.NET 端几乎没有什么逻辑,它只是代理对代理。虽然是在一个实际的应用程序中,但是把来自另一个(WebSphere)Web 服务的数据或者事务合并到它自己的 Web 服务可能更好。
下面的图 15 展示了与 Application Developer 中的 WebShpere 加 J2EE Web 服务进行对话的 ASP.NET Web 服务的返回值。它是 Web 服务对 Web 服务,Microsoft .NET 对 WebSphere 加 J2EE 对 Microsoft .NET。
图 15. 查看所调用方法的 SOAP 返回值
结束语
本教程带您历验了准备一个简单的 J2EE 应用程序和 Microsoft .NET 应用程序客户机的所有基本的步骤,它们在极其不同的编程模型和平台上进行开发,但是通过使用开放的基于因特网的标准进行连接。正是这些开放的标准使从不同的平台和操作系统 ? 甚至从 .NET 平台到 J2EE 平台调用它们成为可能。本教程的目的并不是向您展示在 J2EE 或 Microsoft .NET 平台上怎样开发 Web 服务,而是要说明它们可以交互操作,给我们的 Web 服务的未来的希望和梦想提供依据。
下载 | 名字 | 大小 | 下载方法 |
|---|
| HelloWorldWebServices.zip | 105 KB | HTTP |
参考资料
注意:下面的代码不是 IBM 公司创建的样本代码。该样本代码不是任何标准的 IBM 产品的一部分,将其提供给您目的只是为了帮助您的应用程序的开发。代码是以“仅此状态”的基础提供的,没有任何形式的保证。即便 IBM 告诫过您使用这个样本代码可能造成危害,但是对于这种危害,IBM 概不负责。
关于作者  | 
|  |
Sheldon Wosnick 是 WebSphere Studio Application Developer(属于 IBM Toronto Lab 的 Server Tools 小组)的一名软件开发者。跟他的小组成员一起,他目前负责 Application Developer 的整个服务器运行时和单元测试环境。以前,他是 VisualAge® for Java WebSphere Tools 小组的一员。有时他被人戏称为“运行时家伙”,他给 VisualAge for Java 设计和集成了 WebSphere
Test Environment 和 Apache Tomcat Test Environment,VisualAge for Java 中两个非常流行的功能部件。您可以通过
swosnick@ca.ibm.com与 Sheldon 联系。
|
对本文的评价
|