本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。如有不当之处请大家指正。
作者:youfly email:seedcloned-pub@yahoo.com.cn
转载请注明出处:www.jfuns.com www.jfuns.cn http://blog.csdn.net/youfly
前言
本文描述的是JavaServer Faces 1.2 (JSF 1.2)规范,由JCP(Java Community Process)的JSR-252的专家组开发(更多关于JCP的信息请参考 <http://www.jcp.org>)。
UnifiedExpression Language (EL)
概述
2请求处理生命周期
每一个调用JSF组件树的请求都要经过定义好的由各个阶段组成的“请求处理生命周期”。在这里有三个情景需要考虑,每个情景都有它自己的阶段组成和活动。
■ 非JSF请求生成JSF响应
■ JSF请求生成JSF响应
■JSF请求生成非JSF响应
下面是使用到的术语定义:
■JSF响应(Faces Response)—指由“请求处理生命周期”中的呈现响应阶段生成的响应。
■ 非JSF响应(Non-FacesResponse)—指不是由“请求处理生命周期”中的呈现响应阶段生成的响应. 例如由servlet生成或者由JSP呈现的不是通过JSF组件生成的响应。或者HTTP状态不是设成通常的200的响应(如Redirect)。
■ JSF请求(Faces Request)—指由先前的JSF响应发送的请求。例如由用户接口组件(user interfacecomponent)呈现的超级连接或form提交,其中的URI被处理(由组件或者呈现(renderer)生成)成用来标识处理请求的视图(view)。
■ 非JSF请求(Non-FacesRequest)—一个不是指向JSF视图(Faces view)被发送到应用组件的请求 (例如servlet或者jsp页面).
当然你的应用程序可能接收到非JSF请求 (non-Faces requests)并且产生非JSF响应(non-Faces responses)。因为这些请求根本不会调用JavaServer Faces,它们的处理不在本规范的范围之内,因此不作更多的考虑和介绍。
请者注意:本单的动态行为描述向前引用了一些章节所描述的类和接口。当你碰到这些引用的时候,可能需要找到这些引用的类或接口用处并且忽略它们的定义。然后回到本单节完成行为描述的阅读。在后续的章节中你能够详细的学习到这些类或者接口的特性。
2.1请求处理生命周期情景
这里描述的每一个情景都有一个按照特定的顺序执行的各个阶段组成的生命周期。下面的章节分别介绍各个章节。
2.2.1非JSF(non-Faces requests)请求生成JSF响应(faces responses)
一个应用程序可能需要处理非JSF请求(Non-Faces Request),并用JSF响应(Faces Response)来呈现这个请求。为了达到这个目的,应用程序必须完成下面的一些活动。
■ 获取一个faces对象引用,在第 2.4.1节“获取Faces对象引用”介绍。
■ 创建一个新的视图(view), 在第 2.4.2 “创建和配置一个新的视图”介绍。
■ 通过调用FacesContext的setViewRoot()方法保存一个视图到FacesContext中。
■调用取到的Lifecycle实例的render()方法。 通知JSF实现开始处理“请求处理生命周期”的呈现响应(Render Response)阶段。
2.2.2JSF(faces requests)请求生成JSF响应(faces responses)
最常见的生命周期情况是先前的JSF响应包含将要提交的用户界面控制,利用请求的URI来印射到JSF实现的控制器中。具体在10.1.2 节“ServletMapping”中描述。因为这些请求将被JSF实现作一些初始化的处理,因此应用需要经过一些特别的步骤—它的事件监听器(event listeners),验证(validators),和应用行为(applicationaction)都将标准的“请求处理生命周期”所调用。下图描述了调用的流程:
“请求处理生命周期”各个阶段的具体行为分别在2.2章“标准请求处理生成周期”的各个子章节中介绍。请注意“请求处理生命周期”中每个阶段的处理结果,根据所感兴趣的事件,组件树广播所有的它生成的FacesEvents,共用的事件逻辑(在章节2.3“共用事件处理”中介绍)被执行。
2.2.2JSF(faces requests)请求生成非JSF响应(non-faces responses)
通常基于JSF的应用程序利用“请求处理生命周期”的呈现响应(Render response)阶段来生成发送到客户端的响应。但是在一些环境中这个行为并不能满足人的要求,例如:
■ 一个JSF请求需要重定向到一个不同的web应用 (通过调用HttpServletResponse.sendRedirect)。
■ 一个JSF请求使用其他技术生成响应 (例如一个servlet,或者不包含JSF组件的JSP页面)。
在这种情况下应用程序应该使用标准的servlet或portlet API来生成响应的头和内容。因此有必要告诉JSF实现响应已经被生成,这样JSF实现就可以忽略“请求处理生命周期”的呈现阶段。可以在事件处理器和应用行为(Application Action)中调用FacesContext实例的responseComplete()来通知JSF响应已经被生成。