扩展核心JSF类

上传人:ldj****22 文档编号:45241261 上传时间:2018-06-15 格式:PDF 页数:18 大小:1.85MB
返回 下载 相关 举报
扩展核心JSF类_第1页
第1页 / 共18页
扩展核心JSF类_第2页
第2页 / 共18页
扩展核心JSF类_第3页
第3页 / 共18页
扩展核心JSF类_第4页
第4页 / 共18页
扩展核心JSF类_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《扩展核心JSF类》由会员分享,可在线阅读,更多相关《扩展核心JSF类(18页珍藏版)》请在金锄头文库上搜索。

1、 扩展核心 JSF 类 前所述,JSF 最引人注目的优点之一就是其可插入架构。其大部分特征都是通过可以 轻易被可选实现所替代的类来处理的,这些可选实现可以增强或者替换默认的行为。 这也正是你可以使用 JSP 之外的显示技术 (见附录 A) , 而且它也是允许你修改 JSF 处理表达式、 导航、状态管理、默认的动作监听器等等方式的原因。 在这个附录中,我们将研究 JSF 的架构并讨论如何扩展其核心特征。 为何将这些内容放到附录而不是章节正文中呢?这有个简单原因:大多数开发人员使用默认的行为和特征就足够了, 并不需要关心JSF的内部。 但是, 如果你想要进行高级JSF开发, 你将会对JSF的架构很

2、感兴趣,或者你只是想以某种方式定制化某个实现,这个附录就是 针对你的。 C.1 隐藏于幕后的类 核心的 JSF 类可以分为两种: 基础架构类和可插入类。 基础类包括 Lifecycle、RenderKit、Application和FacesContext。Lifecycle 用于执行请求处理生命周期。RenderKit 则用于 管理呈现器集合,而Application 则维护着对可插入类的的引用,并且提供对其他配置信息的 访问。最后是FacesContext,它处理所有针对请求的功能。 所有这些类都是由工厂创建的,该工厂是在应用配置文件中配置的,并且可通过FactoryFinder(它是一个

3、singleton)定位。这些类都被列于表 C-1 中。 表 C-1 基础类形成了 JSF 功能的骨架 类 说 明 可配置? javax.faces.FactoryFinder 创建并保存工厂实例。具体的工厂实现可通 过 查 询 有 效 的 配 置 文 件 找 到 , 或 者 从 META-INF/ services/factory-class-name文件 (位于 Web 应用自身或者其库路径的任何 JAR 中)中的第一行获得 否 如 附录 C 顺便 说说 附录 C 扩展核心 JSF 类 695 (续) 类 说 明 可配置? javax.faces.lifecycle. LifecycleF

4、actory 创建并保存 Lifecycle 实例 是 javax.faces.lifecycle. Lifecycle 运行请求处理生命周期。通常功能是通过 PhaseListeners 添加的,它可以在代码 中或者在配置文件中注册 否 javax.faces.render. RenderKitFactory 管理 RenderKit 实例的集合 是 javax.faces.render.RenderKit 管理 Renderer 实例的集合。 包含对一个 ResponseStateManager 实例的引用, 后 者处理呈现器特定的状态管理工作 是 javax.faces.applicat

5、ion.ApplicationFactory创建并保存一个单一的 Application 实例(每个 Web 应用一个) 是 javax.faces.application.Application 持有对可插入类的实例和配置信息的引用 是 javax.faces.context. FacesContextFactory 创 建 新 的 ( 或 者 返 回 一 个 缓 存 的 ) FacesContext 实例 是 javax.faces.context. FacesContext 管理所有针对请求的状态,包括消息队列 否 请注意工厂的具体子类(以及RenderKit子类)是可通过应用配置文件配

6、置的。这些类以 及它们之间的关系,如图 C-1 所示。 图 C-1 JSF 基础结构包括可以执行 JSF 核心处理(Lifecycle,Application,RenderKit 和 FacesContext)的对象和管理其实例的工厂 对大多数开发人员来说,并不需要创建定制化的Lifecycle、Application、RenderKit 或者FacesContext实例,因此也不需要定制它们的工厂类。然而,工厂的可替换能力对 JSF 实现的开发人员来说是很有用的。 这个规则的唯一例外是RenderKit类。除标准的 HTML RenderKit外,你可以配置一个或 者多个RenderKit

7、子类。但是请注意,RenderKitFactory 只保存RenderKit 实例,并不创696 第五部分 编写定制组件、呈现器、验证器和转换器:示例 建它们。通常该职责留给 JSF 实现的配置装载器,基于它所找到的配置文件的信息来创建新的RenderKit实例。其结果是,当想要编写自己的RenderKit时,你通常不需要实现新的RenderKitFactory,因为它只是维护 RenderKit实例而已。 注解 如果编写自己的RenderKit,你还必须编写新的ResponseStateManager来处理在客户端状态的保存和恢复。 通常,你不会替换LifecycleFactory实现,但是

8、会通过编写PhaseListener来与 JSF 生 命周期进行集成,PhaseListener 类在特定的请求处理生命周期的阶段之前或者之后执行(更 多信息见第 11 章) 。PhaseListeners 可以在代码中,或者在 JSF 配置文件中注册。 通常,你(或者第三方)替换可插入类的可能性更大。毕竟,这也是 JSF 专家组首先令它们成为可插入的缘故。这种类有:VariableResolver、PropertyResolver、ActionListener、NavigationHandler、ViewHandler和StateManager。除 ActionListener 是一个接口外

9、, 它们都是抽象基类。 VariableResolver 负责求解 JSF EL 表达式的左边标识符, 而PropertyResolver 则求解 “.”之后或者“”之中的标识符。所以,对于表达式“#foo.bar“来说,VariableResolver 返 回 foo 引 用 的 对 象 , 而PropertyResolver 则 返 回foo的bar 属 性 的 值 。 除PropertyResolver还要求解bar的baz属性外,表达式 “#foobarbaz“ 也将按相同 的方式进行求解。 VariableResolver的默认实例查找按指定的关键字保存在不同的应用范围之中的对象,并

10、 且试图在其不存在的情况下通过受管 bean 创建工具创建一个。默认的PropertyResolver则查 询VariableResolver 获得的对象上的属性、List条目、或者Map值(这也是我们在本书中所 讨论的标准 JSF EL 处理方式,详细细节见第 2 章) 。 可插入的ActionListener 处理所有动作事件(无论应用注册的其他任何额外的动作监听 器) 。默认的实例执行我们在此之前讨论过的行为,即它执行一个动作方法,获得逻辑结果,并 根据该结果执行NavigationHandler。 NavigationHandler的工作基于当前的视图、执行调用的动作方法以及返回的逻辑

11、结果来 选择新的视图。默认的 NavigationHandler 实例基于结果和配置的导航规则选择新的视图, 用ViewHandler来创建新视图,并且设置它为FacesContext的当前视图。所选择的视图然后 由ViewHandler 在请求处理生命周期的呈现响应阶段显示出来。默认的ViewHandler通过将 请求转发到 Web 容器来处理这个工作,它则正常地处理 JSP 页面。 ViewHandler 也负责在视图被不止一次地请求时恢复视图。它将状态的保存和恢复委托给StateManager。默认的 StateManager实现在状态保存模式为server时,将组件树保存在会 话中,而

12、在状态保存模式为client时,则保存在隐藏的表单字段中。client模式的状态保存是委 托给RenderKit的ResponseStateManager的,由它在呈现器特定的方式下保存和恢复状态。 所有这些类都列于表 C-2 中,相应的图示如图 C-2。 附录 C 扩展核心 JSF 类 697 表 C-2 可插入类执行关键的 JSF 功能。可以在应用配置文件中(通常是 faces-config.xml)替换默认实现 类 说明 默认功能 javax.faces.el.VariableResolver 求解 JSF EL 表达式 最左边的标识符 在请求、会话或者应用范围中以指 定的关键字查询一个

13、对象。如果对象 确实不存在,则试图通过受管 bean 创 建工具创建它 javax.faces.el.PropertyResolver 求解 JSF EL 表达式 中“.”之后或者“ ” 之中的标识符部分 返回属性、数组元素、列表元素或 者 Map 元素 javax.faces.application.ActionListener 在调用应用阶段对 所有动作事件执行 调用相关的动作方法(如果有), 然后根据获得的结果执行 Navi- gationHandler javax.faces.navigation.NavigationHandler 基于当前视图、 动作 方法(如果有)以及逻 辑结果选

14、择一个视图 基于所配置的导航规则选择视图标 识符,要求由 ViewHandler 创建视 图, 并设置它为 FacesContext 的当 前视图 javax.faces.application.ViewHandler 创建、显示、并恢复 视图。委托 State- Manager 保存和恢复 视图状态 执行创建视图的基本功能,并委托 StateManager 处理状态保存和恢 复,但是依赖于 JSP 容器来构建和显 示组件树(组件树是由 JSF 定制标签 创建的) javax.faces.application. StateManager 保存和恢复视图 如果状态保存模式为 server, 则

15、将 视图保存在会话中;如果是 client, 则 委 托 给 当 前RenderKit的 ResponseStateManager 处理 图 C-2 Application 类有可插入类实例的引用。这些类执行多数 JSF 的过程, 每一个都可被可选的实现替代 可插入类 698 第五部分 编写定制组件、呈现器、验证器和转换器:示例 现在,你已经知道了是哪些类执行 JSF 的关键功能,我们来看看可以怎样修改这些功能。 C.2 替换或者扩展可插入类 大多数时候, 都不需要替换可插入类的默认实现。 但是替换它们可以提供一些强大的可能性, 或者可能是必要的,特别是你正在与其他框架进行集成时。表 C-3

16、列出了你可能会替换或者扩展 这些类的默认实现的一些原因。 表 C-3 可插入类执行关键的 JSF 功能。在一些情况下,你可能想要替换或者装饰它们 类 进行替換或裝飾的可能的原因 VariableResolver ? 为了添加自己的隐含变量 ? 为通用变量名提供速记或者替代的名称 ? 为访问其他上下文(Web 应用、Web 服务、EJB 服务器等等)中的变量 ? 为添加默认属性 PropertyResolver ? 为通用属性提供速记或者替代的名称 ? 为访问其他上下文(Web 应用、Web 服务、EJB 服务器等等)中的变量 ? 为了获取变量的其他属性,比如方法或者其他非 property 的 attribute ? 为了访问特殊对象(比如 DOM 树)的属性 ActionListener ? 为了添加由所有动作事件执行的默认行为,比如 log ? 为了通过不同的方法签名执行动作方法 ? 为了通过不同的框架(比如 Struts Action)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号