EJB 层
该应用程序中有两个 EJB 类。第一个类使用容器管理持久性(Container-Managed Persistence,CMP)来提供对简单数据库表 PhoneBookEntryBean 的基于对象的访问。第二个类是一个 Stateless Session bean,它提供业务逻辑。通常需要通过无状态会话 bean 来操作 CMP bean,因为会话 bean 可被设置来提供对数据库的事务处理,从而在发生错误时可以回滚更新。此外,在 Session bean 中执行所有 CMP 操作使得 Web 应用程序无需知道数据库访问层的任何实现细节。所以如果用另一种技术替换该层(比如使用 Hibernate 持久层),将无需更改 Web 应用程序中的代码。
XDoclet 主要用在 EJB 层中以提供部署描述符生成。这对于减少构建此类应用程序所需的维护工作是十分重要的。下载源代码并查看 PhoneBookEntryBean.java 和 PhoneBookSessionBean.java 的类 Javadoc 注释,以了解用于定义 EJB 类的大量 XDoclet 标记。
要生成无状态会话 bean 的方法,添加名为 @ejb.interface-method 的 XDoclet 标记,其视图类型属性可以为 local、remote 或 both。该属性告诉 XDoclet 在会话 bean 的本地接口、远程接口或两种接口中生成相应方法。您还可以控制事务处理类型。参见 清单 5,它是其中一个接口方法的示例,列出电话簿条目并返回它们的值对象表示。
清单 5. PhoneBookSessionBean.java 类的 listEntries() 方法
/**
* List all of the phone book entries.
* @return a collection of PhoneBookEntryValue objects.
*
* @ejb.interface-method view-type="both"
* @ejb.transaction type="Required"
*/
public java.util.Collection listEntries() {
ArrayList values = new ArrayList();
try {
Collection entries = PhoneBookEntryUtil.getLocalHome().findAll();
Iterator i = entries.iterator();
while(i.hasNext()) {
PhoneBookEntryLocal entry = (PhoneBookEntryLocal)i.next();
values.add(entry.getPhoneBookEntryValue());
}
} catch (Throwable ex) {
ex.printStackTrace();
}
return values;
}
结缔组织
在我的文章“将数据库连接到 Geronimo 应用服务器的三种方法”(developerWorks,2005 年 6 月)中详细介绍了 Geronimo 的各种部署计划的重要性。让这么小的应用程序到达功能状态是非常有挑战性的,需要在部署计划中提供许多小选项,还有 XDoclet 标记之间的交互、标记生成的代码,以及部署计划。但是详细介绍这些内容超出了本文的范围。示例程序有许多配置文件和部署计划,几乎所有的这些东西都能在项目的 src/resources 子树中找到。下文简要介绍了这些文件的相关细节,以说明需要进行哪些修改才能让将来的应用程序工作。
ear 子目录包含企业应用程序部署描述符、application.xml 文件和 geronimo-application.xml 文件。在该应用程序中,这些文件被配置以提供应用程序范围的 Java 数据库连接 (Java Database Connectivity, JDBC) 连接器。
