上一篇文章说了jsf的两个重要步骤,编码和解码。但是,处理顺序则是较为复杂的。现在我们详细讨论jsf的处理顺序(生命周期)。
JSF 应用程序生命周期的六个阶段是:
1、恢复视图
2、应用请求值;处理事件
3、处理检验;处理事件
4、更新模型值;处理事件
5、调用应用程序;处理事件
6、显示响应
下图为jsf的生命周期图,实线为正常流程,虚线表示可选。
一、恢复视图
在 JSF 生命周期的第一个阶段 — 恢复视图 中,通过 FacesServlet
servlet 发来一个请求。这个 servlet 检查这个请求并提取出视图 ID(视图 ID 由 JSP 页面的名称决定)。
JSF 框架控制器使用这个视图 ID 为当前视图寻找组件。如果这个视图还不存在,JSF 控制器就创建它。如果视图已经存在,JSF 控制器就使用它。视图包含所有 GUI 组件。
生命周期的这个阶段有三种视图实例:新视图、初始视图和 postback,每种视图的处理方法各不相同。对于新视图,JSF 构建一个 Faces 页面的视图,并将事件处理函数和检验器连接到组件。视图保存在一个FacesContext
对象中。
FacesContext
存储状态信息,JSF 需要使用这些信息为当前请求管理 GUI 组件的状态。FacesContext
将视图存储在它的viewRoot
属性中;viewRoot
包含与当前视图 ID 对应的所有 JSF 组件。
对于初始视图(第一次装载页面),JSF 创建一个空视图。在处理 JSP 页面时,填充这个空视图。填充初始视图之后,JSF 直接进入显示响应阶段。
对于 postback(用户返回到以前访问过的一个页面),与页面对应的视图已经存在,所以只需恢复它。在这种情况下,JSF 使用现有视图的状态信息重新构造它的状态。
二、应用请求值
应用请求值 阶段的目标是获取每个组件的当前状态。首先,必须从 FacesContext
对象获取或创建组件,然后获取它们的值。组件值常常取自请求参数,但是也可以取自 cookie 或请求头。对于许多组件,来自请求参数的值存储在组件的submittedValue
中。
如果组件的直接事件处理属性是 true,那么值被转换为正确的类型并被检验(在下一阶段中进一步进行转换)。然后,将转换后的值存储在组件中。如果值转换或值检验失败,那么生成一个错误消息并放在FacesContext
中,在显示响应阶段,这个错误消息与任何其他检验错误一起显示。
三、处理验证
转换和检验一般发生在处理检验 阶段。组件转换并存储它的 submittedValue
。例如,如果字段绑定到一个Integer
属性,那么值就转换为一个Integer
。如果值转换失败,那么生成一个错误消息并放在FacesContext
中,在显示响应阶段,这个错误消息与任何其他检验错误一起显示。
在应用请求值阶段之后,发生生命周期的第一次事件处理。在这个阶段,根据应用程序的检验规则检验每个组件的值。检验规则可以是预定义的(JSF 附带的),也可以由开发人员定义。将用户输入的值与检验规则进行对比。如果输入的值是无效的,就将一个错误消息添加到FacesContext
中,并将组件标为无效。如果一个组件被标为无效,JSF 就跳过其他阶段,进入显示响应阶段,就会显示当前的视图和检验错误消息。如果没有发生检验错误,JSF 就进入更新模型值阶段。
四、更新模型值
SF 应用程序生命周期的第四个阶段 — 更新模型值 — 通过更新托管 bean 的属性,更新服务器端模型的实际值。只有绑定到一个组件的值的 bean 属性被更新。注意,这个阶段在检验之后发生,所以可以确信复制到 bean 属性的值是有效的(至少在表单字段级上有效;它们在业务规则级上仍然可能是无效的)。
五、调用应用程序
在生命周期的第五个阶段 — 调用应用程序 — JSF 控制器调用应用程序来处理表单提交。组件值已经经过转换、检验并应用于模型对象,所以现在可以使用它们执行应用程序的业务逻辑。
在这个阶段,调用您的动作处理方法,比如这个示例应用程序的 ContactController
中的 persist()
方法和read()
方法。
toString()
方法。然后使用这个值作为导航规则的结果。
六、响应呈现
在生命周期的第六个阶段 — 显示响应,显示视图和它的所有组件,这些组件都处于当前状态。