级别: 中级 Dan Allen ([email protected]), 高级 Java 工程师, CodeRyte, Inc. 2007 年 6 月 04 日 借助 Seam 开发有状态的 CRUD 应用程序是件轻而易举的事情。在 无缝 JSF
的系列文章的第一篇中介绍了 Seam,它是既能显著增强 JSF 功能又能实现基于组件的架构的应用程序框架。在这篇文章中,我解释了 Seam 尽管这篇文章可能引发了您对 Seam 的兴趣,但是您可能无法确信它能够改善 JSF 开发体验。集成一组新工具通常比阅读它复杂得多,并且有时候并不值得。在无缝 JSF
Open 18 应用程序 Open 18 是基于 Web 的应用程序,允许用户管理一列曾经体验过的高尔夫课程,并记录每个场次的分数。为了体现本讨论的目的,该应用程序的范围仅限于管理高尔夫课程目录。第一个 屏幕展现了已经输入的课程列表,并列出各个课程的一些相关字段,如课程名称、地点和专卖店的电话号码。用户可以从该处查看完整的课程详细内容、添加新课 程、编辑现有课程,最终还可以删除课程。 在讲述如何使用 Seam 为 Open 18 应用程序开发用例时,我重点讲述它如何简化代码,自动管理一系列请求期间的状态,并对输入数据 执行数据模型验证。
Enterprise JavaBeans (EJB) 3。因此,Open 18 应用程序并不依靠 Seam 的 JPA 您可以 下载 Open 18 两个容器的故事
是配置 JSF,使其可以访问 Spring Spring 变量解析器是使用变量解析器节点在 faces-config.xml 文件中 清单 1. 配置 spring 变量解析器
Seam 的上下文组件 为 通过创建名为 在典型的 JSF 应用程序中,使用托管 bean 工具来 清单 2. 作为 JDF 托管 bean 定义的 CourseAction
注释简化了 XML! 现在您想起了使用本地 JSF 方法
Seam 组件更像 Spring bean,而不是 JSF 清单 3. 作为 Seam 组件定义的 CourseAction
Seam 注释的美妙之处。类的 @Name 注释指导 Seam 的变量解析器处理名称与
准备课程列表
在 Open 18 应用程序的开始屏幕中,向用户提供了 清单 4. 初始课程列表视图
Java 代码可能有点难懂。清单 5 展示了如何使用本地 JSF 在作用域为该请求的支持 bean 中准备一个课程集合。为了简便起见, 清单 5. 作为 DataModel 公开课程
使用支持 bean 时带来的性能问题。 如果加载截至目前所开发的页面,然后查看最终
那么兄弟!如果您将这些代码投入生产,最好能 让数据库休息下!
在 getter 方法中获取数据非常不妥。为什么? 清单 6 显示了另一种选择:使用作用域为该请求的 bean 的私有属性 清单 6. 作为 DataModel 公开课程,仅获取一次
清单 6 中的方法只是切断数据检索和数据访问的尝试之一。
上下文状态管理 Seam 使用工厂模式初始化非组件对象和 直到最近,也很少有 Web 应用程序架构提供
使用对话防止存储丢失 要完成一项任务,应用程序常常必须指导用户浏览一系列屏幕。 该过程通常需要多次向服务器发出 post, 或者是由用户直接提交表单,或者通过 Ajax 请求。 在任何一种情况下,都应该能够在用例期间通过维护服务器端对象的状态 跟踪该应用程序。对话相当于逻辑工作单元。它 允许您借助确定的起始点和结束点在单个浏览器窗口中为单个用户创建单 独的上下文。用户与该应用程序的交互状态是针对整个对话维护的。
这项功能解决了 JSF 开发过程中的一项难题,
请求期间保持作用域中的变量。您可以在配置文件中定义对话边界,借助
准备的,或者是其他框架鼓励使用的。conversation 作用域的引入还解决了很多开发人员指出的
借助 Seam 创建对象 回到课程列表示例,这时该重构代码,以利用工厂模式。 目的是允许 Seam 管理课程集合,以便其在请求(包括重定向)期间保持可用。 如果希望 Seam 管理该集合,则必须使用合适的注释将创建过程交给 Seam。
通过注释声明的。实际上,您已经见到过其中一个例子: 在清单 7 中,工厂方法 清单 7. 使用 DataModel 注释公开课程
请注意,这里不存在 清单 8 显示了该视图中发生的相应重构。 清单 8. 使用提取的 DataModel 的课程列表视图
现在再次访问该页面时,以下消息在控制台中只出现一次:
使用工厂构建函数以及临时 conversation 作用域能够在请求期间保持这些数据, 逐步分析创建方案 您可能想知道
值绑定表达式 如果 既然已经清楚检索课程列表以及在 Seam 托管的上下文变量中维护该值的方法,
实现 CRUD 的巧妙方式
JSF 规范实际上为您处理了一些数据选择收集工作。当从 JSF 本身允许您以两种方式访问支持被激活行的数据。 如果选择 现在考虑 Seam 更抽象的获得所选数据的方法。Seam 允许您将针对 Seam 组件定义的
长期运行的对话 要确保回发时该课程列表仍然可用,并且 不必重新从数据库中获取该列表,就能呈现下一个响应, 则必须将当前的临时对话转变成长期运行的对话。 说服 Seam 将临时对话提升到长期运行对话的一种方式是
设置一个方法,使其在执行过程中驻留 您希望允许用户从课程目录中选择单个课程。要实现这项功能,
在 清单 9. 添加命令链接以选择课程
向提供数据选择的支持 bean 添加的内容主要是注释; 放到 conversation 作用域时,必须将该类序列化。 清单 10. 用于捕获所选课程的 DataModelSelection 注释
对话的优点 在 清单 10 中可以看出,所有变量作用域是由 Seam 处理的。 单击某一行的课程名称时,Seam 使用支持该行的课程数据值
借助 Seam,就不必在 faces-config.xml 中定义 如果需要通过声明结束对话,则可以使用
提取课程的详细内容 您尚未详细了解显示课程的用例。 您已经看到一种注入形式,即
默认情况下, 可以在新页面上显示课程详细内容,也可以 显示在同一页面的表格下面。为了演示的目的,在同一页面显示详细内容,同时限制要构造的视图数目。要在另一个页面中 访问提取的变量,不需要额外的工作或特殊技巧。 修订过的支持 bean 与 该支持 bean 的上一个版本 的差别不大,因此,清单 11 仅突出显示了两者的不同之处。 清单 11. 将所选课程提取到视图
其中大多数有趣的变化都发生在视图中,但是这些变化并不新奇。清单 12 显示了在选中某个课程时,呈现在 清单 12. 有条件地为所选课程显示课程详细内容
重新注入课程
但是借助 Seam,实现起来并不困难。要完成这两项需求,
该课程实体耐心地在 conversation 作用域中等待。 但是等等 —— 验证在哪里?您肯定不希望无效数据损坏您的数据库! 借助 Seam 和 Hibernate 进行验证 如果您将整个表单包装到一个 清单 13. 带有 Hibernate 验证注释的课程实体
只需少量步骤 ... 课程对象仅在回发时注入,而回发是用户提交课程编辑器表单 当提交课程编辑器表单时,就可以注入以前提取的课程对象。 还必须向支持 bean 提供三个额外的操作方法,以处理 清单 14. 用于创建、编辑和保存课程的其他操作
是通过在您浏览页面时将所选课程保存在上下文中实现的。
编辑器模板 从编辑器页面(如清单
您不会在课程编辑器视图页面上发现任何本地 JSF 验证器, 清单 15. 课程编辑器视图
添加删除功能 回顾代码片段,可以发现到目前为止重点内容大多涉及 在应用程序中实现删除功能是一项简单的事情。 清单 16. 向 deleteCourse 添加命令链接
在 清单 17. 向 deleteCourse 添加操作方法
完整的课程列表 处理完所有 CRUD 操作,就即将完工了!剩下的惟一的一个步骤 清单 18. 完整的课程列表视图
恭喜!您完成了第一个基于 Seam 的 CRUD 应用程序。
结束语 在 无缝 JSF 系列第二篇文章中,您亲自发现了 Seam 的 实际上可以使用 seam-gen 自动完成大多数 CRUD 工作(请参见 参考资料), 既然已经了解 Seam 减轻 JSF 开发的一些方式, 再见,同时祝您玩高尔夫愉快!
下载
注意:
参考资料 学习
获得产品和技术
讨论 关于作者
|
转自:http://www.ibm.com/developerworks/cn/java/j-seam2/