快速业务通道

Seam - 无缝集成JSF,第2部分: 借助Seam进行对话 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
Manager} 的值注入到定义它的属性。安装 JSF-Spring 集成之后,该表达式解析成 Spring bean 配置中定义的名为 courseManager 的 bean。

Seam - 无缝集成JSF,第2部分: 借助Seam进行对话(3)

时间:2011-06-25 IBM Dan Allen

准备课程列表

既然已经准备就绪,就可以继续研究第一个用例。在 Open 18 应用程序的开始屏幕中,向用户提供了当前存储在数据库中的所有课程列表。借助 h:dataTable 组件标记,清单 4 中的页面定义相当直观,并且不允许任何 Seam 特有的元素:

清单 4. 初始课程列表视图

<h2>Courses</h2> <h:panelGroup rendered="#{courseAction.courses.rowCount eq 0}">  No courses found. </h:panelGroup> <h:dataTable id="courses" var="_course" value="#{courseAction.courses}"  rendered="#{courseAction.courses.rowCount gt 0}">  <!-- column definitions go here --> </h:dataTable>

Java 代码可能有点难懂。清单 5 展示了如何使用本地 JSF 在作用域为该请求的支持 bean 中准备一个课程集合。为了简便起见,去掉了注入的 Spring bean。

清单 5. 作为 DataModel 公开课程

public class CourseAction {   // ...   private DataModel coursesModel = new ListDataModel();   public DataModel getCourses() {     System.out.println("Retrieving courses...");     coursesModel.setWrappedData(courseManager.getAll());     return coursesModel;   }      public void setCourses(DataModel coursesModel) {     this.coursesModel = coursesModel;   } }

清单 5 中的 Java 代码看起来相当直观,不是吗?下面研究 JSF 使用支持 bean 时带来的性能问题。提供实体列表时,您可能使用两种方法之一。第一种是应用条件逻辑呈现至少包含一项的集合所支持的 h:dataTable ,第二种是显示一条信息型消息,声明找不到任何实体。要做出决定,可能需要咨询 #{courseAction.courses},然后再对支持 bean 调用相关的 getter 方法。

如果加载截至目前所开发的页面,然后查看最终的服务器日志输出,就会看到:

Retrieving courses... Retrieving courses... Retrieving courses...

那么兄弟!如果您将这些代码投入生产,最好能找到一个 DBA 找不到的安全隐藏点!这类代码执行对于数据库来说是个负累。更糟的是,回发时情况会恶化,此时可能发生额外的冗余数据库调用。

Seam - 无缝集成JSF,第2部分: 借助Seam进行对话(4)

时间:2011-06-25 IBM Dan Allen

让数据库休息下!

如果曾经使用 JSF 开发过应用程序,就会了解盲目地在 getter 方法中获取数据非常不妥。为什么?因为在典型的 JSF 执行生命周期中,会多次调用 getter 方法。工作区尝试通过委托对象使数据检索过程与后续的数据访问过程相隔离。其目的是避免每次咨询支持 bean 的访问函数时带来运行查询的计算成本。解决方案包括在构造函数中初始化 DataModel(静态块),或 “init” 托管属性;在该 bean 的私有属性中缓存结果;使用 HttpSession 或作用域为会话的支持 bean;并依赖另一层 O/R 缓存机制。

清单 6 显示了另一种选择:使用作用域为该请求的 bean 的私有属性临时缓存查找结果。您会发现,这至少能够在页面呈现阶段消除冗余获取,但是当该 bean 在后续页面超出作用域时,仍然会丢弃该缓存。

清单 6. 作为 DataModel 公开课程,仅获取一次

public class CourseAction {   // ...   private DataModel coursesModel = null;   public DataModel getCourses() {   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号