来开发和测试完整的“Hello World”J2EE 应用程序.doc_第1页
来开发和测试完整的“Hello World”J2EE 应用程序.doc_第2页
来开发和测试完整的“Hello World”J2EE 应用程序.doc_第3页
来开发和测试完整的“Hello World”J2EE 应用程序.doc_第4页
来开发和测试完整的“Hello World”J2EE 应用程序.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

引言在 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)a. 创建新的 2.0 EJB 项目 HelloWorldEJBProject 和新的 EAR 项目名 HelloWorldEARProject 。单击 Finish,然后接受所有其它的缺省值。 b. 选择 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) c.d. 在添加了所有三个字段后,单击 Finish按钮。 第 2 步:使用 Cloudscape 来为 HelloWorldEntity CMP 创建从 EJB 到 RDB 的映射 a. 选择 HelloWorldEJBProject项目,使用新的后端文件夹在目标数据库 Cloudscape V5.0 中完成缺省的、自顶向下的、从 EJB 到 RDB 的映射。您应当指定以下设置: Target Database: Cloudscape, V5.0 Database Name: SAMPLE Schema Name: NULLID a. 图 2. 为 Cloudscape 创建从 EJB 到 RDB 的映射 第 3 步:创建 HelloWorldSession 无状态会话 beana. 选择 HelloWorldEJBProject 项目,在 helloworld.ejb 包中创建新的无状态会话 bean HelloWorldSession 。请确保创建远程客户机视图。接受所有的缺省值,然后单击 Finish。 b. 在 Java 编辑器中打开这个 HelloWorldSession bean 的 HelloWorldSessionBean.java 。添加类型为 HelloWorldEntity 的保护成员并把 null 赋值给它: protected HelloWorldEntity helloWorldEntity = null;c. 现在,添加代码,以使会话 bean 管理工作流并与实体 bean 的远程接口交互。Web 浏览器客户机从不与实体 bean 直接交互,甚至也不与它的远程接口交互。这个客户机只和会话 bean 交互。使用会话 bean 来控制工作流是实现 J2EE 应用程序的典型方式。我们重申我们并不暗示“Hello World”代码和实现是典型的或最佳做法;我们只是使用这些代码来演示这些工具集成得非常好。 d. 在 HelloWorldSessionBean 类中创建 getHelloWorldEntity() 方法,但是不把它提升为远程接口,因为它不必向客户机公开。它是这个类的内部接口并可以是隐藏的。 protected HelloWorldEntity getHelloWorldEntity(int id) . return helloWorldEntity; e. 请参阅下载 ZIP 文件中的 清单 1,其中有这个方法的完整的实现。 f. 把以下 import 语句添加到 HelloWorldSessionBean.java 中: import javax.ejb.*; import javax.naming.*; import java.rmi.RemoteException; g.h. 为了与 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) . i. 请参阅下载 ZIP 文件中的 清单 2,其中有这四个方法的实现。 j. 把这四个方法提升为 HelloWorldSession bean 的远程接口。 第 4 步:生成 WebSphere 部署代码为了为 HelloWorldSession 和 HelloWorldEntity bean 生成部署代码和运行 RMIC,请选择 HelloWorldEJBProject项目,然后在弹出菜单中选择 Generate = Deploy and RMIC code.。 第 5 步:创建服务器项目a. 创建新的服务器项目 HelloWorldServerProject 。 b. 使用您刚创建的服务器项目来创建新的服务器和服务器配置。把服务器的名称设置为 HelloWorldServer ,使用 WebSphere version 5.0 Test Environment服务器类型。如果需要不同于缺省的 9080 的 HTTP 端口,请到下一页并更改这个值。否则,单击 Finish。 c. 现在您位于服务器透视图。使用 Server Configuration 视图把 HelloWorldEARProject 项目添加到 HelloWorldServer 配置中。 a. 图 3. Server Configuration 视图 第 6 步:把数据源绑定到 HelloWorldEntity CMP为了创建从数据源到我们的特定的 CMP 的绑定,我们需要使用 EJB 部署描述符编辑器来编辑 EJB 绑定。a. 选择 J2EE Hierarchy 视图中的 HelloWorldEJBProject项目。用鼠标右键单击这个文件,选择 Open with,选择 Deployment Descriptor Editor。 b. 选择 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 一起正常运行。a. 用鼠标右键单击 J2EE Hierarchy 视图中的 HelloWorldEJBProject 项目中的 HelloWorldSessionbean,然后在弹出菜单中选择 Run on Server。 我们认为这是服务器工具的许多“自动”功能中的一个不错的功能。它将为您“正确地”配置选中的模块(EJB 或 Web 应用程序组件)并为选中的模块类型初始化和启动应用程序服务器。在 EJB 的情况下,安装基于 Web 的通用测试客户机,在嵌入式 Web 浏览器中针对这个 bean 执行通用测试客户机,通过名称服务来查询,找到 home 并使您能够使用它。为了完成这一切,您只需使用一个简单的菜单命令 Run on Server。现在,这就是自动化! 图 6. 运行通用测试客户机 Run on Server 命令 b. 请检查 Server 透视图中的控制台以确保这些 bean 正确地启动。如果您未看到异常或装入模块错误,那么您可以假定它成功了。如果不是这样,那么生成的代码或数据源配置中很可能存在错误。一旦成功启动后,状态将改为 Started。 图 7. 检查服务器状态:服务器已启动 c. 如果服务器已正常地启动,请使用基于 Web 的、集成的通用测试客户机(它将自动出现)来创建 HelloWorldSession 的实例。在这个应用程序中这样做将创建 HelloWorldEntity 的实例。请确保控制台中没有表示持久程序代码没有生成或数据源未被正确地绑定的消息。 d. 请试试会话 bean 的一些远程方法,稍后这些方法将调用实体 bean 的类似方法。这使两个 bean 可以对话,并使数据与配置的数据源保持一致。如果给出的标识尚不存在,那么 HelloWorldSession bean 的设置方法(setFirstName 和 setLastName)将在数据库中创建条目。a. 图 8. 通用测试客户机测试 HelloWorldSession bean b. 当您使用通用测试客户机完成了测试后,请停止服务器,方法是用鼠标右键单击 Servers视图中的 HelloWorldServer,然后选择弹出菜单中的 Stop。 第二轮单元测试:J2EE 应用程序客户机如果您成功使用了通用测试客户机,那么您现在可能想用基于标准的 J2EE 应用程序客户机(这是 J2EE 应用程序模块的一部分)来测试 bean。这意味着在整体上它是应用程序的内置部分而且它是 EAR 模块的一部分。第 8 步:创建 Java 应用程序客户机项目和实现a. 使用现有的 HelloWorldEARProject EAR 来创建新的 J2EE 1.3 应用程序客户机项目 HelloWorldApplicationClientProject 。由于这个应用程序客户机需要访问 EJB 项目 HelloWorldEJBProject 中的类,您需要把这个 EJB 项目添加到从属的 JAR 列表中,以便在编译期间能够找到这个 EJB 项目中的类。 图 9. 把 EJB 项目作为从属的 JAR 添加到应用程序客户机项目。 在创建这个项目时,服务器工具将自动地检测到新的应用程序客户机项目已被添加到 EAR 项目并提示您修复服务器配置。为了对服务器配置作必要的更新,请单击对话框中的 OK。 b. 在 appClientModule 文件夹中,在 helloworld.ejb.clients 包中创建一个新的 J2EE 应用程序客户机类,这个类带有主要的方法 HelloWorldEJBTestClient 。 c. 请参阅下载 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) . d. 请注意,由于这个符合 J2EE 的应用程序客户机与 EAR 模块一起被打包,所以没有必要使用特定于网络的 JNDI InitialContext 而要使用 java:comp JNDI 名称。您不必指定连接到 J2EE 服务器的服务提供者;这说明 J2EE 应用程序客户机有位置透明性。位置透明性的真正优点是“Hello World”应用程序客户机组件不必知道它要连接和使用的 EJB 的确切位置。 e. 为了打开应用程序客户机部署描述符,请用鼠标右键单击 HelloWorldApplicationClientProject,然后选择菜单选项 Open With = Deployment Descriptor Editor。接着,把应用程序客户机的主要的类设为已创建的客户机类 helloworld.ejb.clients.HelloWorldEJBTestClient 。这个设置指定了在启动应用程序客户机时运行哪个主要的类。 图 10. 设置应用程序客户机的主要的类 f. 为了引用会话 bean HelloWorldSession,请添加 EJB 引用 ejb/HelloWorldSession 。(提示:如果您浏览并选择链接中的 HelloWorldSession bean,那么所有的域将被自动填好。)在进行 JNDI 名称查询时将在代码中使用这个引用名称。因此,您必须使用这个引用名称,除非您对代码作相应的修改。 图 11. 使用客户机部署描述符来把 EJB 引用添加到应用程序客户机中。 g. 在 Client Deployment Descriptor Editor 和 JAR Dependency Editor 中保存修改。 h. 启动 Server Configuration 面板中的 WebSphere Application Server。一直等到它完全启动而且没有异常。 i. 使用 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 透视图中,您可以看到控制台输出。 j. 您应当顺利地运行而不出现异常,当应用程序运行结束后,您将在控制台窗口中看到以下输出: 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 k. 如果不是这种情况,请回到前面,一步步地检查,看看是否在哪里犯了错误。如果应用程序成功地运行,那么您现在可以确保您的核心应用程序逻辑能够在不同的(开放的标准,非专有的)客户机配置下正确运行。 l. 当您使用应用程序客户机完成测试后,停止服务器 HelloWorldServer。 第三轮单元测试:完整的端到端 J2EE 应用程序既然您已开发了 EJB,并用运行于应用程序服务器本身中的 EJB 测试客户机测试了 EJB,还用完全运行于应用程序服务器之外的应用程序客户机进一步测试了它们,那么您可能想再进行一轮单元测试。您可能想创建 servlet、JSP、Java bean 和 HTML 主页从而使您可以象上面图 1 显示的那样在所有的不同的层中从头到尾运行 J2EE 应用程序。这样,您就有了可靠的起点,这个起点非常类似于您所期望的用户访问由这个核心逻辑构成的应用程序的方式。第 9 步:创建 Web 项目和读写属性的简单的 Java bean这里使用的体系结构是内容显示与内容生成的典型分离,是一种推荐的 servlet 和 JSP 实现。a. 使用现有的 EAR HelloWorldEARProject 来创建新的 J2EE 1.3 Web 项目 HelloWorldWebProject 。把 HelloWorldEJBProject 添加到从属的 JAR 列表中。接受其它缺省值,然后单击 Finish。为了相应地更新 HelloWorldServer,请在提示您修复服务器配置的时候单击 OK。 b. 在 Web 项目的 Java Source 文件夹(我们稍后将在此构建 servlet)中,在新的包 helloworld.servlet 中创建简单的 Java bean HelloWorldJavaBean 。它将存储会话 bean 返回的值,这样,您下一步创建的 servlet 就可以使您将要创建的 JSP 使用这些值。在编译时,实际的二进制文件将被移到“Web Content”文件夹的 WEB-INFclasses 位置,但是您应当仅在源代码树(即 Java Source 文件夹)中使用源代码。请参阅下载 ZIP 文件中的 清单 4,其中有 HelloWorldJavaBean 的完整的实现。 第 10 步:创建 HelloWorldServlet servleta. 使用 Web 工具在 helloworld.servlet 包中创建简单的 servlet HelloWorldServlet ,仅实现 doPost() 方法存根。然后,实现与 HelloWorldSession bean 通信所需的代码。接受所有其它的缺省值。 这个 servlet 一点也不奇特,它其实并不能揭示执行 JNDI 查询的方式,一般在 init() 方法中完成 JNDI 查询。我们将引用前面创建的 HelloWorldJavaBean,所以请确保您已经按照第 9 步中的描述创建了它。 b. 最后,您应当编写实现的 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/Hell

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论