开发 EJB 并不困难。本文将向您说明可视化创建基于 EJB 的应用程序是非常容易的事情,并使用 WebSphere Studio V5.1.2 及其 UML Visualizer 在服务器端测试它。通过创建简单的图书馆应用程序,您将了解如何使用 UML Visualizer 来创建、修改、部署并测试一组 EJB。
我 无数次听到人们说开发 EJB 太困难了,以至于转而使用简单陈旧的 Java™ bean 来开发他们自己的持久性层,而且他们也许仅仅定义了简单的会话 bean 来使用 EJB 的安全设置。一年以前,我也赞同这些说法。但是,时代改变,开发工具也改进了,EJB 的规范已经成熟。EJB 2.0 规范引入了本地客户端视图,当在同一 JVM 里运行 EJB 时避免了远程的方法调用。此外,IBM® WebSphere® Studio V5.1.1 和 V5.1.2 目前使用 UML Visualizer 来支持可视化创建并操作 EJB。
本文将教您如何使用 WebSphere Studio V5.1.2 中的 UML Visualizer 来创建简单的 EJB 应用程序。带您经历 EJB 的创建、修改、部署以及测试等一系列过程。本文将使用新的 EJB 片段支持向新生成的 bean 中添加业务逻辑。若想了解更多的 WebSphere Studio 中的片段支持,请见 用 WebSphere Studio V5.1.2 中的片段来进行 EJB 编程。在本文最后,我希望使您相信开发 EJB 并不困难,也不复杂,事实上反而快速、轻松。
|
为了说明 EJB 开发是轻松的,本文将教您如何创建简单的图书馆应用程序,它包括上面 UML 图表中所示的 Books 和 Authors。两者之间的关系是一个作者可以有多本书,而一本书只能属于一个作者。
|
这个例子以一个名为 Library 的新企业应用程序的创建过程开始,包括名为 LibraryEJB 的 EJB 模块。
新的企业应用程序将出现在名为 Library 的 J2EE 透视图的 Hierarchy 视图中。并且它包含一个称为 LibraryEJB.jar 的模块。该模块适合于 LibraryEJB 项目,它出现在 J2EE Hierarchy 视图的 EJB Modules 部分的下面。
|
开始可视化地创建 EJB 之前,您必须首先在 LibraryEJB 项目中生成可视化的类图:
默认的保存新图表的位置是在 LibraryEJB 项目中的 ejbModule/META-INF 文件夹下。这个文件夹包括项目中所有的信息单元。在 ejbModule 目录下保存类图(或与此相关的其它内容)当最终的 EAR 文件被输出时将引发它向已部署好的 EJB 模块 JAR 中输出。如果您不想这个类图连同模块一起被输出的话,就将它保存在项目中或者任何不在 ejbModule 中的文件夹里,或者项目中任何其他的 Java 资源文件夹中。例如,您可以在项目中创建名为 diagrams 的文件夹来保存所有的类图,并且这个文件夹将被包含在已部署好的 EJB 模块 JAR 中。
在 图表中您将注意到的第一点是它左侧有一个选项板。这个选项板包括简单选择工具以及添加注释的设备,您可以在图表中选择或者取消它。选项板中的项目都是指示 按钮,指出应用于图表的操作。包括两个部分:Java 和 EJB 2.0。Java 部分包括创建及修改 Java 类和接口的操作。EJB 2.0 用来创建并修改 EJB。对于 EJB 1.1 项目,EJB 部分可能有细微的差别,即仅支持 EJB 1.1 的有效操作。
连同类图一起,作用域中的对象( Book 和 Author)将通过使用 2.0 容器管理的实体 bean 来创建。为了做到这一点,首先选择 CMP 2.0 Entity Bean 选项板项目,然后将鼠标移到图表上使之呈现出加号。点击您的鼠标左键以激活这项操作:
一旦这项操作被激活了,就将打开 Create Enterprise Bean 向导,它的类型已经被选定为 2.0 CMP bean。需要完成向导中余下的步骤来创建我们的 Book CMP bean:
重复先前的几步来添加另一个名为 Author 的 2.0 CMP bean, id 主要的字段被定为 Integer 型并且 name 字段被定为 String 型。
图 表中 EJB 特定的 UML2 Class 类型有两个主要的参数。第一个参数说明了 CMP bean 的持久性(也就是,CMP 字段),第二个参数指出了在客户端的本地界面中有效的操作(或方法)。注意到图表的变化反映在 J2EE Hierarchy 视图中。这是可能的,由于公共的对象模型在图表以及 J2EE 各层次之间是共享的(事实上,这个模型被所有的工具及 WebSphere Application Server 所共享)。
对 象模型没有任何关联是很少见的。所以 Book 和 Author 之间的联系必须要加到图表上。过去,EJB 部署描述符编辑器通过使用 EJB Relationship 向导来添加 EJB 关系。现在仍旧可以这样做,但我发现使用这个向导是非常困难的,因为它所表现的 EJB 2.0 的关系没有依据 UML 来描述。我不知道您的习惯,我总喜欢用 UML 术语来生成关联。这就是 EJB Visual 编辑器真正的优势所在。
为了同另一个 CMP 建立联系,您只需从编辑器的选项板中选择一个 EJB 关联操作就可以实现了。
这些操作表明了来源及目标类型的多样性,以及资源对象的导航性,或者双向,或者单向。下表列出了每个操作的定义。
| 关联操作 | 来源多样性 | 目标多样性 | 是否双向 |
| 1:1 CMP 关联 | 一个 | 一个 | 是 |
| 1:M CMP 关联 | 一个 | 多个 | 是 |
| M:M CMP 关联 | 多个 | 多个 | 是 |
| 1:1 直接的 CMP 关联 | 一个 | 一个 | 否 |
| 1:M 直接的 CMP 关联 | 一个 | 多个 | 否 |
| M:1 直接的 CMP 关联 | 多个 | 一个 | 否 |
| M:M 直接的 CMP 关联 | 多个 | 多个 | 否 |
在选择了合适的操作之后,在 1:M CMP 关联的情况下,选择源 CMP bean( Author),然后拖拽鼠标选择目标 CMP bean( Book),接着释放鼠标。这将建立新的关联并且生成适当的 Java 代码,同时更新 EJB 的部署描述符。注意使用默认的关联名称,以及默认的容器管理关系(Container Managed Relationship,CMR)的字段名称。
在 AuthorBean.java 文件中生成如下的方法来支持联系。
/** |
The following methods are generated within the BookBean.java file to support the relationship.
/** |
由于一个作者可以有多本书,所以需要将从 Author 到 Book 的关联角色设置成 books 和无。这需要部署描述符、bean 类以及更新过的本地接口。这些都可以在如下的图表界面中完成。
应当注意到您可以在图表中改变多样性及 EJB 关联角色的名称。如果您想改变角色的名称或者一个关联角色的导向,那么您应当选择一个 EJB 类的形式并且从 context 菜单中选择 Open。这样将打开 EJB Deployment Descriptor 编辑器并且通过选择 bean 进入 Bean 页面。这时,在 Relationships 部分您可以向下查找并选出您想编辑的关系,然后选择 Edit 按钮。
EJB 2.0 最实际的用处之一是使用无状态的 Session bean 与含有任何本地客户端视图的 Entity bean 相结合。在本例中 Book 同 Author 实体是一样的。
EJB 另一个最实用处是当查找另一个 EJB Home 接口的时候使用 EJB References。这是最实用的方法,因为当进行查找的时候应用程序的 Java 代码仅指向 EJB Reference 名称,并且 bean 的名称不是通用的 JNDI。所以,即使 JNDI 名称改变了(经常发生在部署的过程中),应用程序的代码仍继续有效,这是因为 EJB Reference 绑定到 JNDI 名称上。同 WebSphere Application Server 一样, 本地的 EJB Home 接口仅仅通过使用 EJB Local Reference 才能查找到。不可能通过使用通用的 JNDI 名称来获得本地的引用。
用 EJB Visual 编辑器来创建 EJB Reference。这类似于创建关联。存在两种 EJB Reference 选项板操作。如下所示。
对于本例而言,将创建从 Library 到 Author 以及从 Library 到 Book的两个 EJB Local References,以便使 Library 会话 bean 能同两个实体 bean 相结合。通过如下的步骤来创建这些引用。
在 应用程序中通常为给定的实体 bean 定义额外的"finder"方法。EJB 查询工具通过使用容器管理的持续字段和关系来返回在已知条件基础上建立的实体 bean 的子集。在这个图书馆应用程序中,需要为 Book 实体添加查询工具以便返回指定作者的所有书籍。EJB 查询工具能通过 EJB Visual 编辑器定义在容器管理的实体 bean 中。按照以下步骤向 Book 实体 bean 中添加 findBooksByName 查询工具。
这时新的 EJB Query 被定义成适合于 Book bean 的部署描述符,并且在 BookLocalHome 接口中存在一个新的 findBooksByName(String) 方法。
在本例中实体 bean 被正确地建立起来并且它需要在 Library 会话 bean 中添加业务逻辑来与这些实体结合起来。所需的一个远程方法是 findBookTitlesByAuthor(String),它将返回包含指定作者的 书名的字符数组。所需的第二个远程方法是 populateTestData 方法,它仅被用于测试。这项工作中的某些部分可以在 EBJ Visual 编辑器中完成。
为了向 Library 的 bean 类中加入逻辑信息,必须使适合于 Library bean 的 EJB bean 类能够可视化。这通过在可视化编辑器中选择 Library bean 并在 context 菜单中选择 Show Related Elements 操作来实现。这样打开了用于过滤或显示图表中已选定项目的相关元素的 Show Related Elements in Diagram 对话框。对于本例而言,取消对 Java 及 EJB 复选框的选择,并选择 EJB 标题下的 Abstraction 复选框。 From Selection to Supplier 单选按钮也需要被选定,使得从 bean 中提取的内容能够显示出来。提取的内容包括 bean 类及客户端接口。
单击 OK 之后您将会看到提取出来的内容被添加到类图中了。对于此例而言, Library 和 LibraryHome 元素已经从图表中删除了。但它所占有的隐含的资源并没有被删除。
在类图中通过选择 LibraryBean 元素以及 context 菜单下的 Add Java > Method 操作来将方法添加到 LibraryBean 类中。启动了设置方法信息的向导。我不是这种方法的坚决支持者。用 Eclipse Java 编辑器创建方法是非常容易的,您需要使用 Java 编辑器来添加方法体。因此我更愿意仅仅通过双击 LibraryBean 的方式来打开 Java 编辑器。然后从这里开始添加新的方法。
populateTestData 方法将成为第一个被添加到 bean 中的方法。在添加该方法之前,我们通过添加两个私有方法(BookLocal 和 AuthorLocal)来支持 poplulateTestData 方法。新的 EJB 片断支持将被用来完成这些方法。对于使用这个新功能的细节问题,请见 用 WebSphere Studio V5.1.2 中的片断来编写 EJB 程序。从添加如下的空方法开始。
private BookLocal createBook(int id) { |
使用如下的步骤来完成方法体。
在上述步骤的基础上完成方法体。这时,整理导入是非常必要的,通过选择 [Ctrl]+[Shift]+[O] 来添加缺少的导入。 return aBookLocal 的返回声明需要被添加到方法体的末尾。下面是完整的方法体:
private BookLocal createBook(int id) { |
下面是需要添加到 Author bean 中的与上述方法类似的方法。按照与上面相同的步骤为 Author 添加 "create" 方法。完整的方法如下所示。
private AuthorLocal createAuthor(int id) { |
这两个新方法将被用来简化我们的 populateTestData 方法的代码。通过使用 Java 编辑器来复制下面的方法,并将它粘贴到 LibraryBean.java 文件中。
public void populateTestData() { |
添加 findBookTitlesByAuthor(String) 方法
第二个方法将利用本文前面所述的添加到 Book 中的 EJBQL 查询。这个方法将返回包含指定作者的书名的字符串数组。最初先向 LibraryBean 添加下面的方法名。
public String[] findBookTitlesByAuthor(String name) { |
与 createBook(int) 和 createAuthor(int) 方法类似,EJB 片断支持将被用于建立方法体。
public String[] findBookTitlesByAuthor(String name) { |
|
随 着新的应用程序的建立,必须测试已实现的代码路径。包含 EJB 的 J2EE 应用程序除了建立测试环境有点困难之外没有任何差别。例如,应用程序服务器必须被建立、启动、配置,需要建立数据库,并且必须将 EAR 项目部署并发布到这个服务器上。在所有的这些工作都完成之后,必须有某些装置来测试 EJB 代码的路径。在测试之前花费时间建立环境是不容易的。这对于快速的 J2EE 开发来说是不能接受的。下面说明在 WebSphere Studio 中测试 Library 应用程序是何等的轻松。
我 非常高兴地说在 WebSphere Studio 中测试不会像上面描述的那样复杂。Library 应用程序开发进行到现在,EJB 已经被建模并且附加的业务逻辑已经被添加到 Library 会话 bean 中了。代码的部署、服务器的建立和配置工作还没有进行。能够测试在数据库没有及时建立的情况下添加到 Library 会话 bean 中的两个新的公共方法是非常好的。为了完成这项工作,使用 UTC 来运行这个会话 bean。依据下述步骤进行,这项工作是易于完成的。
选择了 Run on Server 操作之后,将启动向导,按照步骤在特定服务器上测试选定的 EJB。
使用打开的 UTC 我们可以测试新的 Library 会话 bean。首先建立 Library 会话 bean 实例。
现在测试添加到 Library bean 的远程接口中的方法。
除了上述七步之外还要输入 Jones 作为参数并且返回包含三个元素的 Book1、 Book2 和 Book3 的 String[] 值。
|
本 文教您如何使用 WebSphere Studio V5.1.2 及其 UML Visualizer 来创建基于 EJB 的应用程序并在服务器上测试它。这里介绍的可视化的部署技术概要使得先前令人头痛的 EJB 部署问题变得简单快捷。当然,开发应用程序是一个反复循环的过程,需要在设计、实现、测试中不停地重复,而本文并没有展示这些循环过程。 WebSphere Studio 完全支持对于图表、EJB 设计以及数据库表格的不断更新,并且在服务器中重复测试它。对于大多数情况而言,您按照本文所述的步骤进行。但是,为了改善数据库表格中的 CMP 实体的设计,您需要在有 Create and map unmapped elements 选项的后端上启动 EJB-to-RDB Mapping 向导。如想了解详细信息,请见 EJB 文档。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/374079/viewspace-130629/ ,如需转载,请注明出处,否则将追究法律责任。