快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
定向)期间保持可用。如果希望 Seam 管理该集合,则必须使用合适的注释将创建过程交给 Seam。

Seam 使用构建函数实例化和装配组件。这些构建函数是在 bean 类中通过注释声明的。实际上,您已经见到过其中一个例子: @Name 注释。@Name 注释告知 Seam 使用默认的类构造函数创建新实例。要构建自己的课程列表,您不希望使用组件实例,而是使用对象集合。为此,您希望使用 @Factory 注释。@Factory 注释向已提取变量的创建过程附加了一个方法,这是在注释的值中指定的,当该变量没有绑定任何值时就会使用该方法。

在清单 7 中,工厂方法 findCourses()(位于 CourseAction 类)用于初始化 courses 属性的值,该值是作为 DataModel 提取到视图中的。该工厂方法通过将这项工作委托给服务层来实例化课程对象集合。

清单 7. 使用 DataModel 注释公开课程

@Name("courseAction") public class CourseAction {   // ...   @DataModel   private List<Course> courses;      @Factory("courses")   public void findCourses() {     System.out.println("Retrieving courses...");     courses = courseManager.getAll();   } }

请注意,这里不存在 getCourses() 和 setCourses()方法!借助 Seam,使用标记着 @DataModel 注释的私有属性的名称和值将数据提取到视图中。因此不需要属性访问函数。在这个方案中,@DataModel 注释执行两项功能。首先,它提取或公开 该属性,以便 JSF 变量解析器可以通过值绑定表达式 #{courses} 对它进行访问。其次,它提供了手动在 DataModel 类型中包装课程列表的备选方式(如 清单 4 中所示)。作为替代,Seam 自动在 DataModel 实例中嵌入课程列表,以便其可以方便地与 UIData 组件(如 h:dataTable)一起使用。因此,支持 bean(CourseAction)成为简单的 POJO。然后由该框架处理 JSF 特有的细节。

清单 8 显示了该视图中发生的相应重构。与 清单 5 惟一的不同之处在于值绑定表达式。利用 Seam 的提取机制时,使用缩写的值绑定表达式 #{courses} ,而不是通过 #{courseAction.courses} 咨询支持 bean 的访问方法。提取的变量直接放到该变量上下文中,不受其支持 bean 的约束。

清单 8. 使用提取的 DataModel 的课程列表视图

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

现在再次访问该页面时,以下消息在控制台中只出现一次:

Retrieving courses...

使用工厂构建函数以及临时 conversation 作用域能够在请求期间保持这些数据,并确保变量 courses 仅实例化一次,而不管在视图中它被访问了多少次。

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

时间:2011-06-25 IBM Dan Allen

逐步分析创建方案

您可能想知道 @Factory 注释什么时候起作用。为了防止注释变得太神秘,我们将逐步分析刚刚描述的创建方案。可以按照图 1 中的序列图进行研究:

图 1. Seam 提取使用工厂方法初始化的 DataModel

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

视图组件(如 h:dataTable)依靠值绑定表达式 #{courses} 提供课程集合。本地 JSF 变量解析器首先查找与名称 courses 相匹配的 JSF 托管 bean。如果找不到任何匹配,Seam 就会收到解析该变量的请求。Seam 搜索其组件,然后发现在 CourseAction 类中,@DataModel 注释被指派给具有等价名称(courses)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号