科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道利用 Geronimo 深入 EJB Web 应用程序3

利用 Geronimo 深入 EJB Web 应用程序3

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在本文中,您将学习如何扩展初始数据库应用程序,并为之提供一个使用 EJB后端构建的功能用户接口。您还将学习如何使用 Apache Maven 构建系统来构建、打包和部署电话簿数据库应用程序。通过本文学习如何简化您的企业 Web 应用程序开发过程。

作者:Neal Sanche 来源:IT专家网 2008年5月31日

关键字: EJB 深入 Geronimo java

  • 评论
  • 分享微博
  • 分享邮件
在 清单 1 中,前几行设置将在页面中处于活动状态的标记库。它们还将站点模板的内容区域设置为内容将显示的位置。本例展示了一个简单的基于 Struts 的输入屏幕,它用一些 标记来显示资源库文件(位于 webapp/WEB-INF/classes/resources/application.properties)中的字符串。屏幕将名称和电话号码提交给名为 SaveEntry.do 的 Struts 动作。

  如果查看 清单 2 中 SaveEntry.java 源文件中的类 Javadoc 标记,将会看到该应用程序中 XDoclet 标记的第一个示例。这些标记定义生成 Struts 部署描述符 struts-config.xml 必需的所有属性。

  清单 2. SaveEntry.java Javadoc 类标记

/**
 * Save an Entry
 *
 * @struts.action
 *    name = "phoneBookEntryForm"
 *    path = "/pages/SaveEntry"
 *    scope = "request"
 *    input = "/pages/EditPhoneNumberPage.jsp"
 *    unknown = "false"
 *    validate = "false"
 * @struts.action-forward
 *    name = "success"
 *    path = "/pages/ListNumbers.do"
 *    redirect = "true"
 */

  该示例代码位于一个 nutshell 中,展示了 /pages/SaveEntry 动作从 EditPhoneNumberPage.jsp 中获取输入,并使用 phoneBookEntryForm 将来自页面的用户输入打包到 Java 代码中。该动作完成之后,它重定向到 /pages/ListNumbers 动作以显示号码列表。

  ListNumbers 动作位于 ListNumbers.java 文件中,它使用 清单 3 中的代码调用名为 PhoneBookSession 的 Session EJB。

  清单 3. ListNumbers 动作的 execute() 方法的代码段

PhoneBookSessionLocal session =
      PhoneBookSessionUtil.getLocalHome().create();

// Call the method
Collection c = session.listEntries();

// Put the retrieved information into the request attributes
// so the page can render them.
request.setAttribute("numbers", c);

  在 清单 3 中,可以看到 PhoneBookSessionUtil 类的使用。它是一个 XDoclet 生成的类,用于帮助获得 PhoneBookSession 对象的主接口。创建了一个会话,调用了它的 listEntries() 方法,该方法返回所有电话簿条目的集合。然后请求对象中的 numbers 属性被设置为该集合。这样做的效果是将电话号码放到指定位置,以便用于显示条目的 JSP 可以检索并写出列表,如 清单 4 所示。

  清单 4. ListPhoneNumbersPage.jsp 中的 DisplayTag

<display:table name="numbers" requestURI="ListNumbers.do"
    scope="request" pagesize="5" id="row_obj">

    <display:column property="name" title="Name"/>
    <display:column property="phoneNumber" title="Phone"/>

    <display:column title="Actions">
         <logic:present name="row_obj">
              <html:link action="/pages/EditEntry"
                    paramId="id" paramName="row_obj"
                    paramProperty="name">Edit</html:link>
              <html:link action="/pages/DeleteEntry"
                    paramId="id" paramName="row_obj"
                    paramProperty="name" 
                    onclick="return confirmDelete('Number')">
                    Delete
              </html:link>
         </logic:present>
    </display:column>
...
</display:table>

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) 连接器。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章