|
|
翻译:Smiling_Sundoc:田大海 你可以使用Sun ONE Studio 4 IDE的EJB Builder来开发代表Server端业务逻辑的会话 bean,本章讲述了创建无状态和有状态会话 bean的过程。 任何类型的会话 bean都可以用EJB container来管理事务或者你自己写代码来管理事务。会话 bean通过JDBC API或者Java Transaction API (JTA)来访问持久的数据。一个会话 bean能管理一个或多个实体bean。 IDE提供了向导(wizard)来帮助你创建企业bean的各个部分:一个bean class、两个或四个接口。缺省包括一个remote 接口 和一个home 接口,但是你可以替换或添加一个local 接口和一个local home 接口。大多创建会话 bean的过程被自动化了。 当你对会话 bean编程时,除了本章描述的选项外,还有许多其它选项。Sun Java System Studio IDE能帮你做很多编码工作,它还支持很多灵活的选项,让你有很多决策空间。要了解对会话 bean详细的编码指导,请参照《开始之前》中相关资源或者参照企业bean编程的有关文章。 用 EJB Builder 编写会话 BeanEJB Builder是由一系列的向导、属性页、编辑器组成的,你可以用它轻松一致地编写企业bean。要了解你的系统是否安装了EJB Builder,到主窗口中,选择Tools 在Sun Java System Studio IDE中你可以采用多种方法来创建会话 bean。然而如果采用本章推荐的方法,你将获得最全面的支持,并且也是最快的方法。这里提到的方法充分利用了IDE的能力来保证一致性和对J2EE规范的支持。 要得到最好的结果,用EJB Builder编写会话 bean如下: l 创建会话 bean和它要求的类 当你完成了EJB Builder向导要求的步骤后,你就得到了会话 bean的一个框架。会话 bean的三个(或五个)类和逻辑节点就出现在Explorer的Filesystem 面版中。向导产生了所有这些类的声明,需要你来提供这些方法的实现。逻辑节点是你和会话 bean打交道的最好位置。所有的逻辑节点在Explorer中用图标 l 添加方法、参数和异常 利用IDE的GUI支持,你可以利用上下文菜单中弹出的对话框来添加方法,也可以通过直接编辑相应的类来实现。 l 设置会话 bean部署描述文件中的值 通过修改逻辑节点中会话 bean属性页中的属性来完成。 从会话 bean的逻辑节点你可以验证它自己。还可以通过IDE的有关测试手段来测试它。 会话 bean负责处理client和application service的交互;交互的持久时间就是该会话的时间。你该采用哪种类型— 有状态 还是无状态?让container来管理事务还是让它自己管理事务?下面会讨论如何作出选择。 EJB Builder能支持所有这些选择,并且你可以用同一个向导来产生会话 bean的基础框架。最后你再声明会话 bean的类型。 详细信息参照下面小节的内容: 无状态 还是有状态 会话 Bean会话 bean的主要目的是代表client执行有关工作。也就是说代表client在server端与一个或多个实体bean执行一次对话(conversation)。当这个对话包含多个简单的问题和回答时,对话的管理者(也就是会话 bean)必须能够记住这些信息直到对话结束。这种情况下,会话 bean必须要有状态。而无状态 会话 bean管理一个相对不是很复杂的对话。 关于如何选择的更详细的讨论参见第二章。表3-1列举了设计中应该考虑的有关因素。
Container-Managed还是Bean-Managed事务 象第二章中详细论述的那样, 你必须声明用那种方式来管理事务。表3-2概括了这些选择间的差异。
对采用container-managed事务(CMT)的企业bean,container在方法将要执行前开始一个事务,并在该方法将要退出前提交该事务。采用CMT,你可以让client来控制事务。例如,client可以通过一个有状态 CMT 会话 bean调用不同的方法来串起一个逻辑的商业事务。 对采用bean-managed事务(BMT)的企业bean,你必须显示地在代码中声明一个事务的开始和结束。 EJB Builder向导能自动创建会话 bean缺省的三个类:一个bean class、你选择的接口(remote、 local或者二者都有)。采用下面的步骤来定义会话 bean: 1. 选择或创建一个包来存放会话 bean 2. EJB Builder 向导来生成 会话 bean的基础框架 3. 添加create方法和业务方法 4. 编写所添加方法的方法体 这些基本的步骤下面会有详细的解释。 创建包 要创建一个包来存放会话 bean,选择一个filesystem,右击选择New Package。 启动EJB Builder 向导 创建会话 bean,按下列步骤进行: 1. 在IDE的主窗口中,
选择View 2. 在Explorer的Filesystems屏面上,选择会话 bean要存放的包。 3.右击并选择New 系统弹出EJB Builder向导。注意左边的面板显示了创建会话 bean当前的步骤和将要完成的步骤。 产生缺省的会话 Bean 在EJB Builder的Session Bean Name and Properties屏面上,你必须就状态、事务类别、接口类型作出选择。按下列步骤进行: 1. 输入会话 bean的名字,选择会话 bean的类型 选择适当的按钮状态、事务类别、接口类型作出选择。图3-1显示了你的选择。注意它们的缺省值 Stateless、Container-Managed、Remote Interface Only。 图3-1 无状态 (或 有状态 BMT) 会话 Bean向导选项示例 注意:在向导第一个屏面上的选项决定了向导如何生成代码。如果以后你想改变这些最基本的选择,可以用bean的属性页来完成,参照第八章。 2. 单击 Next 系统打开会话 Bean Class Files屏面,下图为无状态 会话 bean。 对于有状态 会话 bean来说,你还有另外一个选择要做:会话同步。 这个选项在表3-4和使用会话同步中有解释。 3. 检查bean class和接口,如果需要,改变它们。 组成会话 bean的类以及它们所在的路径显示在这个屏面上。
如果你指定了命名的包以外的任何类,这些类将以不同于图3-2中的形式显示出来。
在你改变这些域之前,同样考虑以下几点:
4. 完成这些步骤后单击Finish。 向导自动生成会话 bean 的基础框架所包含的部分,下面要分别讨论它们。 EJB Builder向导产生会话 bean 缺省的类,并建立了这些类之间的关系。图3-2说明了一个典型的会话 bean (它的所有类在同一个包中)如何在 Explorer 的 Filesystems 屏面上显示的。 图3-2包含remote接口的会话 Bean的缺省类 用类图标
展开节点 当你展开会话bean包节点下面的四个节点时,它们象树图一样,参照图3-3。 图3-3 包含remote接口会话 Bean的Explorer详细视图 回顾产生的类 EJB Builder自动生成了一个create方法和几个生存周期方法。下面我们来讨论这些方法。 缺省的create方法 向导在每个会话 bean class里面产生一个如下的ejbCreate方法的签名:
相应的create方法放在了会话 bean的home接口里面:
要了解更多信息,参照完成Create方法。 生存周期方法 向导在任何会话 bean的bean class里面产生了如下的生存周期方法。
表3-3列举了会话 bean中这些方法作用。
如果你选择让会话 bean采用会话同步接口,向导会在bean class里面产生另外三个方法:
关于会话同步的解释请参照表3-4。
完成会话 Bean的创建步骤随着bean的种类不同而不同。指导方针如下: 采用推荐的方法处理企业bean 附录A讲述了对企业bean处理应该采用的最好方法。以及你采用其它方法可能出现的错误和异常。 一般来讲,你应该通过逻辑节点而不是类节点来处理企业bean。通过bean的属性页或Customizer对话框来编辑方法。当不能由某个对话框来编辑时,用IDE的Source Editor来完成和编辑任何bean的代码。 如果你的bean是无状态型的,只有一个没有任何参数的create方法。无状态 会话 bean中不含有任何特定用户或特定client的数据。 如果你的bean是有状态型的,它可以含有一个或多个可带参数的create方法。 在任何情况下,在逻辑节点下进行工作。在Source Editor打开create方法(通过选择标记为create()的节点,右击并选择Open来实现)。在Source Editor中完成create方法。 完成无状态 Bean 的Create方法 在无状态 会话 bean中,create方法经常被用来和某些资源建立连接。例如这个方法可以用来look up一个资源工厂的引用,并把它存放在一个域变量中,这样以后的方法调用中可以通过它获得JDBC连接。 完成有状态 Bean 的Create方法 在有状态 会话 bean中,你可以用create方法中的参数来look up资源工厂的引用,或传送一个特定 client 的信息(例如用户名和密码),见代码例子3-1。这个方法可以存储信息供以后使用。 注意这个 create 方法使用了一个helper class,IdVerifier。
在有状态 Bean中增加Create方法 在有状态 Bean中增加Create一个或多个方法,按下面步骤来做: 1.选择bean的逻辑节点,右击并选择Add Create Method。 系统弹出Add Create Method对话框 2. 输入一个以create开始的方法名,如果需要添加参数和异常,单击OK。 Create方法的签名生成在home接口中,对应的ejbCreate方法生成在bean class里面。 3. Source Editor中完成编码工作。 在bean的逻辑节点中,展开Classes节点,选择Bean Class,右击并选择Open。 EJB Builder为你产生了四个生命周期方法。对无状态 会话 bean来说,这四个方法已足够了。对有状态 会话 bean来说,你可能需要在下面两个方法中添加有关代码:ejbPassivate 和ejbActivate。 例如,有状态 bean中可能含有不能序列化的域变量(通过取代引用而变的能序列化)。或者bean的对话状态中含有打开的资源(在bean的实例被钝化时,container不能保持该状态)。对每种情况,你必须完成ejbPassivate方法来释放不能序列化的域变量。然后完成相应的ejbActivate方法来恢复这些域变量。 完成ejbPassivate方法 这个方法为域变量的序列化作准备。如代码例子3-2所示,你必须在这个方法中关闭所有的JDBC连接,并给存储连接的域变量赋值为null。
完成ejbActivate方法 如代码例子3-3中所示,这个方法使得域变量重新变得可用。
在会话 bean中,你可以增加业务方法来为client执行业务任务。这个方法可能访问数据库,或者管理一个或多个实体bean。 要在有状态 会话 bean中增加业务方法,按下列步骤来做: 1. 选择bean的逻辑节点,右击并选择Add Business Method。 系统弹出Add Business Method 对话框。 2. 给方法命名,保证返回值是合适的,如果需要添加参数和异常,单击OK。 业务方法的签名产生在remote接口,对应的方法在bean class中实现。 3. Source Editor中完成编码工作。 在bean的逻辑节点中,展开Classes节点,选择Bean Class,右击并选择Open。 如果会话 bean需要访问数据库,通过在一个数据存取对象(DAO)中封装对数据库的访问,可能会减少JDBC调用次数(也节省了系统资源和网络带宽)。DAO为会话 bean完成实际的数据存取工作。采用DAO能使会话 bean的代码简单明了。也使你的bean不依赖特定厂家的工具或数据库。 对事务进行编码依下列的条件不同而不同:会话 bean是有状态型还是无状态型,采用BMT还是CMT。下面的指导方针包括声明事务边界,处理回滚,和利用会话同步接口。 了解事务的跨度(span) 事务的跨度依会话 bean的类型而有所不同。表3-5对此作了概括。注意CMT加上statefulness给一个bean更多的灵活性。
声明事务边界和回滚 本节讨论对事务的起始点和终止点编码的指导方针,适用于CMT 和BMT bean。开始之前,请记住下面的通用规则:
CMT Bean在CMT bean中,所有事务的边界都由EJB container来设定,这就意味着你不需要声明一个事务的开始和结束。通常EJB container在将要执行一个方法前开始一个事务,在将要退出这个方法前提交这个事务。 不要调用任何可能干扰container事务边界的方法。可能出现问题的方法有:
会话 bean可以用两种方法回滚container-managed事务:
BMT Bean在BMT bean中,你必须显示地编码来开始和终止一个事务。用javax.transaction.UserTransaction接口来显示地划分事务的边界。下面的代码例子中,使用了JTA接口:
当在事务中作的更新操作要保存,事务用commit来结束。当事务失败,执行回滚操作,也就是执行事务中操作的反操作。当你对采用BMT的会话 bean执行回滚时,不要采用getRollbackOnly 或setRollbackOnly方法,这两个方法只是用来和EJB container交互。 有状态 CMT 会话 bean能够使用会话同步接口,它能使bean更好地控制缓存在事务中的数据库数据。 这个接口提供了一些回调方法,这些方法分别在一个事务开始前、提交前、回滚前被EJB container调用。利用这个接口,在事务的特定阶段,会话 bean 的实例变量能够和数据库中相应的值同步。如果事务没有完成,会话 bean 能回滚实例变量的值。
要在会话 bean中增加会话同步接口,在向导中作如下选择: 1.在会话bean向导的第一个屏面中, 在State部分, 选择Stateful。 2. 在会话bean向导的第二个屏面中,选择Implement Session Synchronization Interface。 如果你作了这些选择,类似代码例子3-4中的代码被插入到会话 bean class。在这个例子中checkingBalance和savingBalance变量 在afterBegin方法中装入。
代码例子3-5表明了在afterCompletion方法中,当事务失败回滚后,用数据库刷新account-balance域变量的值。
要使你的会话 bean 在最终的环境中工作,还有很多工作要做。要了解部署描述符信息,如何使用属性页,模块的组装和应用的部署等信息,请参照第八章。 关于使用已完成的企业 bean 的建议,参照附录A。 企业bean是你的应用中强大而灵活的部分。创建企业bean的基础部分是很简单的,特别是借助Sun Java System Studio IDE类似的工具。然而,要使它们满足你的应用的需要是非常复杂的。要了解详细的信息请参照http://java.sun.com/products/ejb/docs.html中的Enterprise JavaBean Specification, version 2.0。
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||