|
翻译:Smiling_Sundoc:宋黎松
企业bean各元素之间的联系错综复杂。Sun Java System Studio IDE为保持bean的完整性作了相当多的假设,但同时可以灵活地支持不同的选项,以便bean的重用。本附录给出了使用现存企业bean的最佳操作。
编辑bean时采用推荐方法
为了确保更改可以如你所愿,应通过企业bean的逻辑节点和属性页进行编辑。如果采用这些推荐方法,IDE可以保证遵循J2EE规范中的标准。
下面将阐述这些方法。
通过逻辑节点工作
作为一条通用规则,你应通过企业bean的逻辑节点来修改bean的代码。这个节点的图标看上去如同一个咖啡豆:
。此节点被设计用以组织企业bean的所有元素。
当你对逻辑节点操作完毕时,IDE最容易将你所作的修改应用到整个bean中。
bean所包含的所有类被罗列在这个节点下面,仿佛bean是一个对象。这里你可以编辑你的企业bean,不必考虑哪个类必须获取每个更改。例如:
l
当你在bean的逻辑节点下为Create
Methods节点添加新方法时,该方法体(ejbCreateXxx)及其相关的方法(实体bean所要求的ejbPostCreateXxx)被添加至本地home接口,home接口,或两者兼有。
l
当你在实体bean的逻辑节点下面为Finder
Methods节点添加新方法时,Add
New Finder Method对话框提示你输入方法的正确名称。方法的特征符号被添加至本地home接口,home接口,或两者兼有。
¡
在CMP实体bean中,Add New Finder Method对话框还会提示你给出EJB QL Select,From和Where语句。当你将你的bean部署到可支持的应用程序服务器上时,这个EJB
QL代码被自动转换为该服务器要求的SQL类型。
如果你打算定义一个新的finder方法或select方法,但尚未准备提供EJB
QL代码,你可以禁止EJB Compiler要求EJB QL。参见编译和验证企业bean。
¡
在BMP实体bean中,相应的ejbFind方法也被添加至bean类中。
l
当你在bean的逻辑节点下为Business
Methods节点添加新方法时,其方法体被添加至该bean类内。根据bean的接口类型,方法的特征符号被添加至逻辑接口、远程接口内,或两者兼有。
l
当你在bean的逻辑节点下为Home Methods节点添加新方法时,其方法体被添加至该bean类内,而且该方法的特征符号被添加至相应的接口内。
l
当你在CMP实体bean的逻辑节点下为Select Methods节点添加新方法时,Add New Select Method对话框提示你提供完成该方法所需的所有信息,包括EJB QL语句。其方法体被添加至bean类内。
很多情况下,即使当你在操作bean的其他节点编辑Java代码时,IDE均可传播你的更改,并且同步bean的各个类和接口。然而,通过操作逻辑节点你可以得到最一致的结果。
使用Customizer或属性页
当你需要修改方法的名称或返回类型时,或者当你需要编辑和添加参数或异常时,操作的最佳位置是在方法的Custermizer对话框或属性页内。在逻辑节点下,选中方法,双击,然后选择Customize(自定义)或Properties(属性)。
l
Customizer的格式与你在创建方法时对话框的格式相同。
l
属性页以制表形式列出方法的各个部分,与方法所属的类相对应。
你在这两个地方所作的任何修改,均在验证之后以适宜的形式传播至相应的类。
当你需要添加代码来完成方法时,请使用IDE的Source Editor(源代码编辑器)。
警告—如果你在逻辑节点外面进行修改,EJB Builder仍然试图通过在bean类代码内或其中某个接口节点内进行操作以传播你的修改。然而,在特定情况下,你可能需要手工确认你的代码是否符合Sun的J2EE规范。参见后面的具体示例。
使用Source Editor(源代码编辑器)来编辑bean
仅仅通过使用IDE的源代码编辑器你就可以创建或修改企业bean的任何部分。然而,IDE的向导和其他GUI工具被设计用以保存你的工作并帮助避免不一致性,以便你能够快速制作标准的、遵循J2EE的企业bean。
某些情况下,如果你绕过EJB
Builder提供的帮助,你可能得到混淆的结果。EJB
Builder努力将你在一个类中所作的修改适当地同步到其他类中,但是这个工具不可能总能够理解你的意图,而且不可能应用所有需要的修改。因此,如果你直接修改类的代码,结果可能导致错误的企业bean,你必须手工予以纠正。
下面有几个例子:
l
你在源代码编辑器中打开bean的接口类(home,远程,本地home,或本地),为新方法添加代码。为使之有效,方法必须有名称和正确的返回类型,而且方法必须抛出正确的异常。如果新方法有效,它被自动添加到bean类。如果无效,在你编码时方法仍然只保留在接口内。随后,你可能查找并修复方法中的问题。然而,EJB Builder不可能总能够将修复后的的方法添加至bean类;你可能不得不自己添加。在你手工添加之前,方法的节点在Explorer中始终显示带有红X的错误符号。(参见理解IDE的错误信息。)此处有两个例子是关于如何在各个类之间传播更改:
¡
如果你正确地将create方法添加至home接口,则EJB Builder自动将相应的ejbCreateXxx方法添加至bean类。
¡
如果你正确地将ejbCreateXxx方法添加至bean类,则EJB Builder自动将相应的create方法添加至适宜的接口。
l
你在源代码编辑器中打开bean类,添加finder方法。
编辑器验证代码。假如该方法有效,它被自动添加至相应的接口。
l
你在源代码编辑器中打开bean类,添加business方法。
编辑器尽最大可能地验证代码。然而,有可能你已经只打算在bean类中添加helper或utility方法,因而方法不向远程或本地接口传播。
l
你将带有正确异常的business方法添加至bean的远程或本地接口。
该方法被自动地传播给bean类。
l
你使用源代码编辑器修改bean的home(或本地home)接口内的create方法,或者修改bean的home(或本地home)接口内的business方法。
EJB Builder将你的修改传播给bean类。
l
你在bean类中修改ejbCreateXxx方法。
编译器尽最大可能地验证代码,但是不将修改传播给home接口或本地home接口。(在IDE中Java接口类之间的关系始终被同等对待。)
l
你在bean的home接口中修改方法。在此过程中,你通过删除所需的异常使方法无效。
编译器验证代码并提供错误信息,但是不将更改传播给bean类。
l
你在bean类中输入一个新的create方法,并将其命名为非ejbCreate或ejbCreateXxx的其他名称。或者,你在home接口或本地home接口内输入一个新的finder方法,并将其命名为非findByXxx的其他名称。(或者,你修改这样一个方法。)
编译器验证此声明的语法是否正确,以及返回类型和参数类型是否为可解析的有效Java类。
警告—一旦你开始在Source Editor(源代码编辑器)中编辑一个类,在你明确保存之前,你的企业bean就不会被保存。
理解IDE的错误信息
如果你创建的代码与J2EE规范不一致,那么警告符号或错误符号就会出现在Explorer的节点图标中。为了查看问题的描述,选中出问题的节点,右键点击,然后选择Error
Information(错误信息)或Validate EJB(验证EJB)。
逻辑节点上的这个黄色三角警告符号表示bean或bean的某个类可能存在验证问题。展开逻辑节点查看问题到底出现在哪里。例如,远程接口中定义的方法可能不在bean类中,或者类可能扩展了错误的Java超类。即使你能够编译bean,也会遇到问题。
逻辑节点上的这个红色X错误符号表示bean或bean的某个类可能存在严重问题。例如,整个类可能丢失。产生这个错误符号的bean无法执行,甚至不允许交互。
编译和验证企业bean
EJB Builder包含一个定制的编译器,可以根据Enterprise JavaBeans Specification(企业JavaBeans规范)验证你的企业bean。你可以决定是否分别完成编译和验证。然而,当你选中企业bean节点,右键点击它,然后选择Validate EJB(验证EJB),缺省的操作是编译bean,随之立即对其进行验证。
应注意,单独编译不能捕获所有的错误,而且如果bean出现编译错误,它将不被验证。
在IDE中验证和编译服务于不同的目的。当你只编译企业bean时,IDE编译组成bean的各个类。如果这些类的Java代码语法正确,则bean的编译没有错误,即使其中某个类与其他类或与J2EE规范不一致。为了确保企业bean的各元素之间保持一致,你还必须验证bean。
EJB编译器遵循IDE对build(建立)、compile(编译)和clean(清除)的定义。
l
如果bean已经过期(也就是,自从上次成功编译以来,bean的部署描述符已被修改,或者直接引用的Java类已被修改),那么编译按照Enterprise
JavaBeans Specification(企业Javabean规范),既编译Java类又验证Java类。
l
clean(清除)删除直接引用的Java类文件和上一次EJB编译的时间戳。
l
build首先执行clean操作,然后编译引用的类。
大多数情况下,在你往复进行的开发周期内,通过使用EJB编译器的缺省选项可以节省相当多的时间。然而,在特定条件下(例如,如果在成功编译之后你必须修改超类),编译无法捕获Java或EJB验证错误。在这些情况下,你可能需要执行build(可能跨越几个目录,根据bean的所有Java文件的位置而定)来检测或解析编译错误。
编译器同时对CMP实体的select方法和finder方法作一些语义上的检查。你可以再次选择是否让编译器要求EJB
QL语句。有时,你可能发现将此要求关闭会比较方便,这样你开发、编译和验证你的企业bean时就不会收到有关丢失EJB QL语句的错误消息。然而,你必须在将bean部署到IDE的嵌入应用程序服务器—J2EE
Reference Implementation(RI)之前添加EJB QL(并将编译器的EJB QL要求选项打开)。这个服务器和其他一些东西需要EJB
QL,服务器插件将其转换为它所需要的SQL,以便在你的finder和select方法中运行查询。
为了给你的企业bean设置编译和验证选项,采取以下步骤:
1. 从主菜单中,选择Tools(工具)->Options(选项)。
2. 展开Options(选项)节点,Building(建立)节点,以及Compiler
Types(编译类型)节点。
3. 选取EJB 2.0 Complier(EJB 2.0编译器)。
4. 在属性页内,做出你的选择。
两个字段的缺省设置均为True(真)。以下情况中应修改设置:
l
如果你希望能够在编译bean之前采取单独的步骤来验证你的bean,则应将Require Compilation(要求编译)字段修改为False(假)。
l
如果你希望你的bean在其finder方法和select方法内没有EJB QL语句的情况下通过验证,则应将Require
EJB QL(要求EJB QL)字段修改为False(假)。
如果你选择将验证与编译分离开来,则应按照以下操作验证你的bean:
l
在Explorer的Filesystems(文件系统)面板中,选中bean的逻辑节点,右键点击,然后选择Validate
EJB(验证EJB)。
根据bean的大小而定,验证可能需要花费一些时间。当验证完成时,输出窗口打开并显示bean的相关信息。
当你编译EJB模块或对模块的操作涉及到编译时(比如导出EJB
JAR文件,或者为导出计算类文件时),模块及其包含的所有bean均自动被验证。
保存你的修改
很多情况下,你的工作被自动保存。然而,并不总是如此。例如,编译bean时并不总是保存它。当你从IDE中退出时,应注意确认对话框并保存你希望保存的工作。为达到最佳效果,在IDE中应定期采用File(文件)->Save
All(全部保存)。
重新命名企业bean
当你重新命名bean时,不必手工重命名bean的所有相关对象和它们的内部引用。通过IDE的GUI支持(下面即将介绍),IDE自动地同步所有的接口(既包括它们的外部对象名,又包括源代码内的相关引用)。采取以下操作:
1. 选中bean的逻辑节点,右键点击,选择Rename(重命名)。
Rename(重命名)对话框出现。你一开始向New
Name(新的名称)字段中输入,选取框选项就被激活。
2. 使用选取框一次重命名bean的所有相关对象。
然而,如果你从别处获取到bean的对象,那么应仔细考虑你是否打算将其重新命名。例如,如果两个或更多的实体bean共享相同的home接口或远程接口,那么无论它们出现在哪里,你都可能希望同样的接口保持相同的名称。
警告—如果你单独重新命名任何一个相关对象,那么对象之间的连接会被丢失。
修改基于其它bean的bean
企业bean的类可以基于其它bean的类。例如,你可以创建一个企业bean,该bean使用其它bean的远程接口。当你修改基于其它类的类时,你实际上在修改其原始类。较晚的这个bean指向较早的那个bean的类;你并没有操作类文件的一份独立拷贝。这是IDE设计的一部分,以便于重用企业bean的各个元素。
复制和粘贴企业bean
当你将一个bean复制并粘贴至另一个包时,IDE在新包内创建一个节点,指向原始包内的类和接口。IDE并不认为你需要包内的所有内容;一些开发者需要更灵活地重用bean的元素。因此,你同时必须确保bean的所有类和接口的路径已被修改为新的包。
为了将企业bean从一个包复制并粘贴至另一个包,操作如下:
1. 在Explorer的Filesystems(文件系统)面板中,右键点击你希望复制的bean的逻辑节点,然后选择Copy(复制)。
2. 右键点击你希望将bean复制到的包,选择Paste(粘贴)->Copy(复制)。
3. 展开原始bean逻辑节点下的Classes(类)节点,右键点击类或接口的节点,选择Copy(复制)。然后通过右键点击目的包并选择Paste(粘贴)->Copy(复制),将类或接口粘贴至目的包。
对于bean的每个类和接口,均重复此步骤。
4. 右键点击被复制bean的逻辑节点,选择Properties(属性)。
5. 在属性页中,将每个类更新为指向目的包。查找以下字段:
l
bean类
l
home接口(如果存在)
l
远程接口(如果存在)
l
本地home接口(如果存在)
l
本地接口(如果存在)
l
主键类(如果存在)
a. 点击每个字段,然后点击省略号(…)按钮。
b. 在属性编辑器中,浏览至目标包,选择你粘贴至该包内的类或接口的副本,点击OK。
属性值变为PackageName.classname。
在你完成之后,每个类和接口的属性具有附加在原始名称上的包名称。目标包包含bean的完整副本。
互换bean类或接口
在你创建企业bean之后,你可能需要将其修改为使用其它bean的某个元素,比如home接口或远程接口。为了这样做,应按照以下操作来使用bean的属性页:
1. 在Explorer窗口中,选中需要不同类或接口的bean,右键点击,选择Properties(属性)。
2. 在Properties(属性)面板内,点击相应的属性(Bean
Class(bean类),Home Interface(home接口),Primary Key Class(主键类),或Remote Interface(远程接口)),然后点击省略号(…)按钮。
3. 浏览至你打算使用的类或接口,选中它,然后点击OK。
属性字段显示了新类或新接口的全限定路径名称。你的bean不包含新元素的副本。它仅仅指向原始元素。
编辑bean的方法
当你通过使用Explorer窗口提供的GUI支持添加了一个方法之后,你可以在源代码编辑器中编辑此方法。如果所有你需要做的就是在bean类中完成该方法体,而且你的编辑操作不影响其他任何类或接口,那么你应使用源代码编辑器。然而,由于这些更改可能对其他类产生少许影响,你可能需要在bean的相关对象内同步这些修改。例如,参见使用源代码编辑器编辑bean。
或者,你可以只使用Customizer(定制器)对话框,如下所示:
1. 在Explorer窗口中,展开你需要编辑其方法的bean的逻辑节点。浏览至此方法。
2. 选中此方法,右键点击,然后选择Customize(自定义)。
Customizer(定制器)对话框出现,其字段与New
Method(新建方法)对话框相同。
3. 根据需要编辑字段。当你完成之后点击Close(关闭)。
IDE将你的修改传播至整个bean。
查看方法
为了查看你为企业bean创建的方法,展开bean的逻辑节点并浏览至你需要查看的那种方法的子节点。右键点击该方法的节点并选择Open(打开)。Source Editor(源代码编辑器)打开该类,直接显示此方法的代码。
修改实体bean的字段
根据你的实体bean是使用容器管理持续化还是bean管理持续化,你可以采取不同的方法来重新命名字段或修改字段的类型。
重新命名字段
在CMP bean中,使用Explorer窗口提供的GUI支持。操作如下:
1. 展开bean的逻辑节点并选择CMP字段。右键点击,然后选择Rename(重命名)。
2. 使用选取框来指定你修改的范围。
在BMP bean中,使用Source Editor(源代码编辑器)来重新命名持久化的字段或非持久化的字段。
修改字段的类型
在CMP bean中,使用Explorer的GUI支持。修改字段的类型如下所示:
1. 展开bean的逻辑节点并选择CMP字段。右键点击,然后选择Customize(自定义)。
2. 在Customize(自定义)对话框中,选择另一种类型。
在BMP bean中,使用Source Editor(源代码编辑器)来修改持久化字段或非持久化字段的类型。
删除企业bean
无论企业bean是哪种类型,删除bean均采取以下操作:
1. 选中bean的逻辑节点,右键点击,然后选择Delete(删除)。
Confirm EJB Deletion(确认EJB删除)对话框出现。
2. 通过使用选取框来确认你是否打算一次删除bean的所有相关对象。
如果bean的某个相关对象被用在其他地方,则你应慎重考虑是否打算删除它。例如,如果几个实体bean使用相同的主键类,则在删除bean的其他类之前,你应取消选定该类的选取框。
警告—当删除bean时不要从菜单栏中选择Edit(编辑)->Delete(删除);IDE仅删除被选中的类,它并不设法同步bean的组成部分。
|