级别: 初级 Sheldon Wosnick (eyuen@ca.ibm.com), 软件开发者,IBM WebSphere Studio Application Developer, IBM 多伦多实验室
2003 年 8 月 01 日 在本教程中,我们将使用 WebSphere Studio Application Developer V5.0 来开发、测试、运行和调试完整的 J2EE 应用程序,这个程序由实体和会话 EJB、一个 servlet、一个 JSP 页面和一个 HTML 主页构成。
© Copyright International Business Machines Corporation 2003. All rights reserved.
引言
在 2001 年 10 月,Sheldon Wosnick 发表了有关使用 WebSphere Studio 来完成和测试完整的 J2EE 应用程序的文章。
那篇文章是基于 WebSphere Studio 的第一个 beta 版。此后,已发行了大约八个或九个版本,而且出现了许多变化!我们将在更新的文章中介绍 WebSphere Studio V5.0 的一些新的功能,例如 J2EE 应用程序客户机、为 Cloudscape 自动地创建数据源以及如何创建和配置资源引用,我们觉得这样做将对开发者社区有大有好处。
在本教程中,我们将使用 WebSphere® Studio Application Developer V5.0 来开发、测试、运行和调试完整的 J2EE 应用程序,这个程序由实体和会话 EJB、一个 servlet、一个 JSP™ 页面和一个 HTML 主页构成。我们将以 EJB 开发为重点作详细介绍。整个应用程序将只直接使用 Application Developer 工具和运行时。
为了保持开发者的传统,这个 J2EE 应用程序是所有的组件被命名为
HelloWorld的“Hello World”应用程序。因此,例如,您将创建和部署的实体 bean 将被称为
HelloWorldEntity,会话 bean 将被称为
HelloWorldSession,servlet 被称为
HelloWorldServlet,以此类推。这使我们能够把重点放在主要的概念上而不在细节上花费太多的时间,也使我们可以采用简单的代码。
下载中提供了源代码和清单。对于那些想使用预先创建的应用程序来学习本教程的读者来说,我们也在下载中提供了它。下载 ZIP 文件包含完成的 EAR 模块和本教程中用到的代码清单。有了这个现成的版本,您只需导入 EAR 模块,创建表,创建和配置服务器项目、实例和配置,然后运行、调试和测试这个应用程序。但是,为了熟悉开发环境和各个部件的紧密集成,我们希望您从头开始创建一切。
那么,我们的目的就是重点介绍 Application Developer 工具。本文的目的并不是教您如何创建 J2EE 应用程序 - 我们确信您很可能是这方面的专家 - 而是向您演示这些工具如何无缝地集成编写 J2EE 应用程序的代码并对它进行单元测试所需的所有步骤,从而提高程序员的生产力和满意度。
您将创建的助诊文件
在这个“Hello World”端到端、多层的、分布式 J2EE 应用程序中,我们计划为您演示创建和使用以下全部的 J2EE 助诊文件(这些文件跨越典型的分布式 J2EE 应用程序中的三个主要的层 - 客户机(显示)、应用程序和数据)是可能的。
- J2EE 应用程序(EAR 模块)
- J2EE Web 应用程序(WAR 模块)
- J2EE EJB 模块
- 无状态会话 EJB
- 容器管理的实体 EJB(CMP)
- 数据源(映射到 Cloudscape)
- J2EE 应用程序客户机模块
- Java™ bean(用于 servlet 和 JSP)
- servlet
- JSP 页面
- HTML 页面
“Hello World”的体系结构
用于这个应用程序的体系结构使用所谓的 J2EE“Model 2”体系结构,Model 2 是经典的模型-视图-控制器(model-view-controller,MVC)体系结构的一个版本,在 Model 2 中,servlet 被用作控制器,JSP 被用来显示最终的输出。在这种情况下,会话 bean 被用来控制工作流并直接与客户机(这恰巧是 servlet)交互,它接着与实体 bean 交互,实体 bean 进一步与使它持久的数据存储交互。在您考虑这个简单的分布式“Hello World”J2EE 应用程序时,实际上这个程序很复杂。我们将为您演示在 WebSphere Studio Application Developer 中开发和测试它是多么地容易。
学习本教程
为了构建和测试这个“Hello World”J2EE 应用程序,您应当严格地完成以下步骤和过程。如果您计划从头开始创建这个应用程序,那么这是应该完成的过程。您可以下载预先创建的版本(EAR 模块格式),您只需象导入任何其它 EAR 模块到 Application Developer 那样导入这个版本。我们假定您知道“创建实体 bean……”的含义。如果您不知道,请在 Application Developer 的帮助文档中查阅有关如何使用 Application Developer 工具的详细信息。
WebSphere® Studio Application Developer V5.0 支持 EJB 1.1 和 EJB 2.0 规范。本教程中使用 EJB 2.0 规范。然而,涉及的步骤非常类似于使用 EJB 1.1 规范的步骤。
当您完成本教程时,您将有许多不同类型的项目和助诊文件,每个表示不同的 J2EE 助诊文件,例如 Web 模块和 EJB 模块。当您完成的时候,完整的、端到端应用程序的 J2EE 视图应当与下面的图 1 相似。
图 1. 完成的“Hello World”端到端应用程序的 J2EE 视图
开发步骤
第 1 步:创建 EJB 项目和 HelloWorldEntity 容器管理的实体 bean(CMP)
- 创建新的 2.0 EJB 项目
HelloWorldEJBProject 和新的 EAR 项目名
HelloWorldEARProject 。单击
Finish,然后接受所有其它的缺省值。
- 选择
HelloWorldEJBProject 项目。在
helloworld.ejb 包中创建新的 CMP 2.0 bean
HelloWorldEntity ,这个 bean 带有下面列出的持久字段。在创建这些字段之前,选中
Remote client view复选框。请确保选中每个字段的
Promote getter and setter methods to remote interface复选框和
Promote getter and setter methods to local interface 复选框,id 字段除外,您必须使 id 成为关键字段。提供缺省值:
firstName (String)
lastName (String)
id (int, Key Field)
|
- 在添加了所有三个字段后,单击
Finish按钮。
第 2 步:使用 Cloudscape 来为 HelloWorldEntity CMP 创建从 EJB 到 RDB 的映射
- 选择
HelloWorldEJBProject项目,使用新的后端文件夹在目标数据库 Cloudscape V5.0 中完成缺省的、自顶向下的、从 EJB 到 RDB 的映射。您应当指定以下设置:
Target Database:
Cloudscape, V5.0
Database Name:
SAMPLE
Schema Name:
NULLID
图 2. 为 Cloudscape 创建从 EJB 到 RDB 的映射
第 3 步:创建 HelloWorldSession 无状态会话 bean
- 选择
HelloWorldEJBProject 项目,在
helloworld.ejb 包中创建新的无状态会话 bean
HelloWorldSession 。请确保创建远程客户机视图。接受所有的缺省值,然后单击
Finish。
- 在 Java 编辑器中打开这个 HelloWorldSession bean 的
HelloWorldSessionBean.java 。添加类型为
HelloWorldEntity 的保护成员并把 null 赋值给它:
protected HelloWorldEntity helloWorldEntity = null; |
现在,添加代码,以使会话 bean 管理工作流并与实体 bean 的远程接口交互。Web 浏览器客户机从不与实体 bean 直接交互,甚至也不与它的远程接口交互。这个客户机只和会话 bean 交互。使用会话 bean 来控制工作流是实现 J2EE 应用程序的典型方式。我们重申我们并不暗示“Hello World”代码和实现是典型的或最佳做法;我们只是使用这些代码来演示这些工具集成得非常好。
- 在 HelloWorldSessionBean 类中创建
getHelloWorldEntity() 方法,但是不把它提升为远程接口,因为它不必向客户机公开。它是这个类的内部接口并可以是隐藏的。
protected HelloWorldEntity getHelloWorldEntity(int id) {
...
return helloWorldEntity;
}
|
请参阅下载 ZIP 文件中的
清单 1,其中有这个方法的完整的实现。
- 把以下 import 语句添加到
HelloWorldSessionBean.java 中:
import javax.ejb.*;
import javax.naming.*;
import java.rmi.RemoteException;
|
- 为了与 HelloWorldEntity 实体 bean 对话,请添加以下远程方法:
public String getFirstName(int id) {
...
}
public void setFirstName(int id, String firstName) {
...
}
public String getLastName(int id) {
...
}
public void setLastName(int id, String lastName) {
...
}
|
请参阅下载 ZIP 文件中的
清单 2,其中有这四个方法的实现。
- 把这四个方法提升为 HelloWorldSession bean 的远程接口。
第 4 步:生成 WebSphere 部署代码
为了为 HelloWorldSession 和 HelloWorldEntity bean 生成部署代码和运行 RMIC,请选择
HelloWorldEJBProject项目,然后在弹出菜单中选择
Generate => Deploy and RMIC code...。
第 5 步:创建服务器项目
- 创建新的服务器项目
HelloWorldServerProject 。
- 使用您刚创建的服务器项目来创建新的服务器和服务器配置。把服务器的名称设置为
HelloWorldServer ,使用
WebSphere version 5.0 Test Environment服务器类型。如果需要不同于缺省的 9080 的 HTTP 端口,请到下一页并更改这个值。否则,单击
Finish。
- 现在您位于服务器透视图。使用 Server Configuration 视图把
HelloWorldEARProject 项目添加到 HelloWorldServer 配置中。
图 3. Server Configuration 视图
第 6 步:把数据源绑定到 HelloWorldEntity CMP
为了创建从数据源到我们的特定的 CMP 的绑定,我们需要使用 EJB 部署描述符编辑器来编辑 EJB 绑定。
- 选择 J2EE Hierarchy 视图中的
HelloWorldEJBProject项目。用鼠标右键单击这个文件,选择
Open with,选择
Deployment Descriptor Editor。
- 选择
Beans选项卡,然后,为配置绑定而选择
HelloWorldEntitybean。为 WebSphere Bindings 部分下的绑定输入 JNDI 名称的以下的值。在本教程中使用下面显示的 JNDI 值(尽管您可以输入任何 CMP 容器工厂 JNDI 名称)。
JNDI name:
ejb/helloworld/ejb/HelloWorldEntityHome
CMP Container Factory JNDI Name:
jdbc/cloudscape/HelloWorldDatasource
Container authorization type:
Per_Connection_Factory
图 4. 把数据源绑定到 CMP EJB
当您完成时,请为保存配置而按
Ctrl-S或单击工具栏上的
Save图标。
第 7 步:创建数据源和 Cloudscape 数据库表
WebSphere Studio Application Developer V5.0 中的一个很酷的功能使您能够自动地为 CMP 设置 Cloudscape 数据源和数据库表。这个新功能使您能够快速地测试 CMP 从而避免了手工地创建数据库和数据源的麻烦。(如果您想了解有关如何用 Cloudscape 来创建容器管理的持久性的更多信息,请参阅
参考资料。)
为了自动地创建数据源和 Cloudscape 数据库表,请用鼠标右键单击
Servers视图中的
HelloWorldServer,然后选择
Create tables and data sources菜单选项。接着,一个对话框将显示数据源和数据库表已被成功地创建(图 5)。
图 5. Cloudscape 数据源和表的创建。
现在您可以测试 HelloWorldEntity CMP bean。
第一轮单元测试:通用测试客户机
至此,实际上您已创建、开发、部署和配置了不少东西,因此,我们建议在完成下一组步骤(即实现 servlet、JSP 和相关代码)之前进行某些测试是合适的。我们认为(肯定带有偏见,但是请您自己作出判断)这里体现了 Application Developer 工具的优点而且这些工具提供了无缝的、集成的和强大的测试功能。因为在缺省情况下通用测试客户机(Universal Test Client)已被添加到服务器中并在 Application Server 中运行,所以,请先使用通用测试客户机来确保 EJB 至少有功能而且持久机制能够与 Cloudscape 一起正常运行。
- 用鼠标右键单击 J2EE Hierarchy 视图中的 HelloWorldEJBProject 项目中的
HelloWorldSessionbean,然后在弹出菜单中选择
Run on Server。
我们认为这是服务器工具的许多“自动”功能中的一个不错的功能。它将为您“正确地”配置选中的模块(EJB 或 Web 应用程序组件)并为选中的模块类型初始化和启动应用程序服务器。在 EJB 的情况下,安装基于 Web 的通用测试客户机,在嵌入式 Web 浏览器中针对这个 bean 执行通用测试客户机,通过名称服务来查询,找到 home 并使您能够使用它。为了完成这一切,您只需使用一个简单的菜单命令
Run on Server。现在,这就是自动化!
图 6. 运行通用测试客户机 Run on Server 命令
- 请检查 Server 透视图中的控制台以确保这些 bean 正确地启动。如果您未看到异常或装入模块错误,那么您可以假定它成功了。如果不是这样,那么生成的代码或数据源配置中很可能存在错误。一旦成功启动后,状态将改为
Started。
图 7. 检查服务器状态:服务器已启动
- 如果服务器已正常地启动,请使用基于 Web 的、集成的通用测试客户机(它将自动出现)来创建 HelloWorldSession 的实例。在这个应用程序中这样做将创建 HelloWorldEntity 的实例。请确保控制台中没有表示持久程序代码没有生成或数据源未被正确地绑定的消息。
- 请试试会话 bean 的一些远程方法,稍后这些方法将调用实体 bean 的类似方法。这使两个 bean 可以对话,并使数据与配置的数据源保持一致。如果给出的标识尚不存在,那么 HelloWorldSession bean 的设置方法(setFirstName 和 setLastName)将在数据库中创建条目。
图 8. 通用测试客户机测试 HelloWorldSession bean
- 当您使用通用测试客户机完成了测试后,请停止服务器,方法是用鼠标右键单击
Servers视图中的
HelloWorldServer,然后选择弹出菜单中的
Stop。
第二轮单元测试:J2EE 应用程序客户机
如果您成功使用了通用测试客户机,那么您现在可能想用基于标准的 J2EE 应用程序客户机(这是 J2EE 应用程序模块的一部分)来测试 bean。这意味着在整体上它是应用程序的内置部分而且它是 EAR 模块的一部分。
第 8 步:创建 Java 应用程序客户机项目和实现
- 使用现有的 HelloWorldEARProject EAR 来创建新的 J2EE 1.3 应用程序客户机项目
HelloWorldApplicationClientProject 。由于这个应用程序客户机需要访问 EJB 项目 HelloWorldEJBProject 中的类,您需要把这个 EJB 项目添加到从属的 JAR 列表中,以便在编译期间能够找到这个 EJB 项目中的类。
图 9. 把 EJB 项目作为从属的 JAR 添加到应用程序客户机项目。
在创建这个项目时,服务器工具将自动地检测到新的应用程序客户机项目已被添加到 EAR 项目并提示您修复服务器配置。为了对服务器配置作必要的更新,请单击对话框中的
OK。
- 在 appClientModule 文件夹中,在
helloworld.ejb.clients 包中创建一个新的 J2EE 应用程序客户机类,这个类带有主要的方法
HelloWorldEJBTestClient 。
- 请参阅下载 ZIP 文件中的
清单 3,其中有 HelloWorldEJBTestClient 的完整的实现。
package helloworld.ejb.clients;
import javax.naming.*;
Import java.util.*;
Import javax.rmi.*;
Import helloworld.ejb.*;
public class HelloWorldEJBTestClient {
public static void main(String[] args) {
...
}
|
请注意,由于这个符合 J2EE 的应用程序客户机与 EAR 模块一起被打包,所以没有必要使用特定于网络的 JNDI InitialContext 而要使用 java:comp JNDI 名称。您不必指定连接到 J2EE 服务器的服务提供者;这说明 J2EE 应用程序客户机有位置透明性。位置透明性的真正优点是“Hello World”应用程序客户机组件不必知道它要连接和使用的 EJB 的确切位置。
- 为了打开应用程序客户机部署描述符,请用鼠标右键单击
HelloWorldApplicationClientProject,然后选择菜单选项
Open With => Deployment Descriptor Editor。接着,把应用程序客户机的主要的类设为已创建的客户机类
helloworld.ejb.clients.HelloWorldEJBTestClient 。这个设置指定了在启动应用程序客户机时运行哪个主要的类。
图 10. 设置应用程序客户机的主要的类
- 为了引用会话 bean HelloWorldSession,请添加 EJB 引用
ejb/HelloWorldSession 。(提示:如果您浏览并选择链接中的
HelloWorldSession bean,那么所有的域将被自动填好。)在进行 JNDI 名称查询时将在代码中使用这个引用名称。因此,您必须使用这个引用名称,除非您对代码作相应的修改。
图 11. 使用客户机部署描述符来把 EJB 引用添加到应用程序客户机中。
- 在 Client Deployment Descriptor Editor 和 JAR Dependency Editor 中保存修改。
- 启动 Server Configuration 面板中的 WebSphere Application Server。一直等到它完全启动而且没有异常。
- 使用 Application Client Launcher(而不是 Server Launcher)来运行您自制的 HelloWorldEJBTestClient 类。在 WebSphere Studio Application Developer V5.0 中,您只需进行最少的设置就可以使用 Application Client Launcher 来容易地运行应用程序客户机。在 J2EE 透视图中,选择 J2EE Navigator 视图中的
HelloWorldEJBTestClientJava 文件,选择菜单选项
Run => Run...。创建新的 WebSphere V5 应用程序客户机
HelloWorldEJBTestClientLauncher ,把
HelloWorldEARProject选为企业应用程序,不要改动其它缺省设置。呆在 J2EE 透视图中,您可以看到控制台输出。
- 您应当顺利地运行而不出现异常,当应用程序运行结束后,您将在控制台窗口中看到以下输出:
Getting the InitialContext...
Performing the lookup..
Parameters passed to the commandline:
Parameter 'id' = 99
Parameter 'firstName' = John
Parameter 'lastName' = Smith
Calling Session bean methods..
Verifying method calls happened...
First Name Returned: John
Last Name Returned: Smith
|
如果不是这种情况,请回到前面,一步步地检查,看看是否在哪里犯了错误。如果应用程序成功地运行,那么您现在可以确保您的核心应用程序逻辑能够在不同的(开放的标准,非专有的)客户机配置下正确运行。
- 当您使用应用程序客户机完成测试后,停止服务器 HelloWorldServer。

 |

|
第三轮单元测试:完整的端到端 J2EE 应用程序
既然您已开发了 EJB,并用运行于应用程序服务器本身中的 EJB 测试客户机测试了 EJB,还用完全运行于应用程序服务器之外的应用程序客户机进一步测试了它们,那么您可能想再进行一轮单元测试。您可能想创建 servlet、JSP、Java bean 和 HTML 主页从而使您可以象上面图 1 显示的那样在所有的不同的层中从头到尾运行 J2EE 应用程序。这样,您就有了可靠的起点,这个起点非常类似于您所期望的用户访问由这个核心逻辑构成的应用程序的方式。
第 9 步:创建 Web 项目和读写属性的简单的 Java bean
这里使用的体系结构是内容显示与内容生成的典型分离,是一种推荐的 servlet 和 JSP 实现。
- 使用现有的 EAR HelloWorldEARProject 来创建新的 J2EE 1.3 Web 项目
HelloWorldWebProject 。把 HelloWorldEJBProject 添加到从属的 JAR 列表中。接受其它缺省值,然后单击
Finish。为了相应地更新 HelloWorldServer,请在提示您修复服务器配置的时候单击
OK。
- 在 Web 项目的 Java Source 文件夹(我们稍后将在此构建 servlet)中,在新的包
helloworld.servlet 中创建简单的 Java bean
HelloWorldJavaBean 。它将存储会话 bean 返回的值,这样,您下一步创建的 servlet 就可以使您将要创建的 JSP 使用这些值。在编译时,实际的二进制文件将被移到“Web Content”文件夹的
WEB-INF\classes 位置,但是您应当仅在源代码树(即 Java Source 文件夹)中使用源代码。请参阅下载 ZIP 文件中的
清单 4,其中有 HelloWorldJavaBean 的完整的实现。
第 10 步:创建 HelloWorldServlet servlet
- 使用 Web 工具在
helloworld.servlet 包中创建简单的 servlet
HelloWorldServlet ,仅实现
doPost() 方法存根。然后,实现与 HelloWorldSession bean 通信所需的代码。接受所有其它的缺省值。
这个 servlet 一点也不奇特,它其实并不能揭示执行 JNDI 查询的方式,一般在
init() 方法中完成 JNDI 查询。我们将引用前面创建的 HelloWorldJavaBean,所以请确保您已经按照第 9 步中的描述创建了它。
- 最后,您应当编写实现的 servlet 和
doPost() 方法的代码。请参阅下载 ZIP 文件中的
清单 5。这个 servlet 几乎与上面的应用程序客户机相同,不同点在于它被实现成 servlet,与应用程序客户机相似,您无需指定服务提供者和特定于网络的 JNDI 初始的上下文,因为这个 servlet 是 Web 模块的一部分。Web 模块是包含 EJB 的 EAR 模块的一部分。
第 11 步:创建 HTML 主页
使用 Web 工具来添加简单的主页
index.html ,这个主页被用作传递参数并把它们发送(post)到 servlet 的表单。因为 HTML 不被认为是“源代码”,所以把它添加到“Web Content”文件夹,这个文件夹是工作文档根目录。这里不需要特定的样式表,所以不要指定样式表。然后,使用设计或源代码视图,创建三个文本域(
ID number、
First Name和
Last Name域)和执行 POST 的 Submit 操作。请参阅下载 ZIP 文件中的
清单 6,其中有这样的页面的示例。
第 12 步:创建最终显示给用户看的 JSP
使用 Web 工具来创建简单的 JSP 页面
HelloWorldJSP.jsp 并且不指定样式表。完成与创建 HTML 页面的步骤相同的步骤。这个 JSP 看上去象下载 ZIP 文件中的
清单 7中提供的 JSP 一样简单。
第 13 步:创建 EJB 会话 bean 的引用
因为我们将在运行这个应用程序时从 Web 项目中引用会话 bean HelloWorldSession,所以我们必须把 EJB 引用添加到 Web 模块部署描述符中。用鼠标右键单击 J2EE Hierarchy 视图中的 Web 模块
HelloWorldWebProject,选择菜单选项
Open With => Deployment Descriptor Editor。然后,添加 HelloWorldSession bean 的 EJB 引用,引用名是
ejb/HelloWorldSession 。下面显示的是这个引用的详细信息:
EJB reference name:
ejb/HelloWorldSession
Link:
HelloWorldEJBProject.jar#HelloWorldSession
Type:
Session
Home:
helloworld.ejb.HelloWorldSessionHome
Remote:
helloworld.ejb.HelloWorldSession
JNDI Name:
ejb/helloworld/ejb/HelloWorldSessionHome
(提示:如果您浏览并选择链接中的 HelloWorldSession bean,那么所有的域将被自动地填好(引用名除外)。)
在进行 JNDI 名称查询时将在代码中使用这个引用名。因此,您必须使用这个引用名,除非您对代码作相应的修改。在 Web 部署描述符编辑器中保存您作的修改。
图 12. 创建 EJB 会话 bean 的引用
第 14 步:在服务器上运行完整的应用程序
至此,您已构建了完整的、端到端 J2EE 应用程序的所有的不同的部分,并且可以用简单的、直接的方式从头到尾测试它。
- 为了在服务器上运行您创建的
index.html 表单,请选择
index.html文件,然后使用
Run on Server命令。如果它提示您选择服务器,请选择使用现有的服务器
HelloWorldServer。与前面的描述相似,这个命令将为您自动地、正确地处理和运行特定的组件。如果服务器已经运行,那么您必须先停止它,再重新启动它,这样,由于把新的 Web 应用程序(WAR 模块)添加到企业应用程序(EAR 模块)而在配置中出现的更改就能在服务器中生效。
图 13. 在服务器上运行应用程序
- 在输入域中输入某些数据,然后提交。这将使执行转移到 servlet 控制器,然后转到会话 bean,再转到实体 bean。这个 bean 与数据存储保持一致,然后把执行转回 servlet,这个 servlet 把值放在 Java bean 中,把这个 bean 设置到会话中,然后把整个请求和响应分派给 JSP 以便显示给用户看。请耐心一点,因为在第一次提交请求时,需先生成 JSP,再编译它,这将用去几秒的时间。后续的提交几乎是即时的。
图 14. 简单的 HTML 输入和提交表单
- 在完整的应用程序在上面的图 1 中的所有的分布式层中运行之后,最后的输出是显示 JSP 生成的 HTML 并返回给浏览器。
结束语
本文描述了如何使用 WebSphere Studio Application Developer V5.0 中提供的工具来开发、测试、运行和调试完整的、端到端、分布式、多层的应用程序。Application Developer 工具使设置和配置问题不再分散您的注意力,使您把重点完全放在核心业务逻辑和强大的、集成的 J2EE 助诊文件的创建和单元测试上。
下载 | 名字 | 大小 | 下载方法 |
|---|
| HelloWorldApplicationDeveloper2.zip | 0.2 MB | HTTP |
参考资料
关于作者  | 
|  |
Elson Yuen是 IBM 多伦多实验室从事 WebSphere Studio Application Developer 工作的软件开发者。他目前正在设计开发包括 WebSphere Test Environment 在内的服务器工具(Server Tooling)。以前他是 VisualAge® for Java WebSphere Test Environment JSP 调试支持的主要开发者。Elson 拥有安大略省沃特卢大学的电子工程学士学位和管理科学选修学位。您可以通过
eyuen@ca.ibm.com与 Elson 联系。
|
对本文的评价
|