当点 击 超 链 接或者表 单 按 钮 , JSF 请 求被 创 建, JSF 实现 框架开始 Restore View 阶 段。 这 个 阶 段中, JSF 实现 框架 为页面 打造 视图 ,在 视图 中 组 装事件 处 理器和校 验 器,保存 这 个 视图 到 FacesContext 实 例之中。 FacesContext 实 例包含所有的需要被 单 个 请 求 处 理的信息。所有的 组 件 标签 ,事件 处 理器, 转换 器和校 验 器都可以 访问这 个 实 例。
如果是提交 请 求,于 这 个 请 求相 对应的视图早已经存在,在这个阶段, JSF实现框架通过使用已保存在客户端或者服务器端的状态信息来恢复这个视图。
在恢复组件数之后,组件树中的每个组件从请求参数中使用它的 decode方法,解析出该组件的新值,然后,这些新值被存储到相应的组件之中。如果转换失败,会生成一个错误信息,和这个组件关联上,放到 FacesContext的错误消息队列之中。这个错误消息将会在 Render View Phase这个阶段中显示, Validation Processing Phase产生的校验错误也采用如此方式。
如果没有任何 decode 方法或者事件 监 听 调 用 renderResponse 于当前的 FacesContext 实 例, JSF 实现 框架跳 过 Render Response 阶 段。
这 个 阶 段中,如果一个事件被安排到 队 列中, JSF 实现 框架广播 这 个事件 给对 此事件感 兴 趣的 监 听器。
在 这 个 阶 段中,如果 页 面上的一些 组 件有 immediate 属性被 设 置 为 true ,那么校 验 器, 转换 器和 这 个 组 件上的事件会被立即 处 理。
这时,如果 WEB应用需要重定向到一个不同的 WEB应用或者 Non-Faces Response组件,需要调用 FacesContex.responseComplete.
这个阶段的末尾,设置组件的新值,消息和事件被放到队列之中。
在这个阶段, JSF实现框架处理组件树中所有已经注册于组件之上的校验器,用指定的规则检验组件的属性值。如果组件的属性值无效, JSF实现框架向 FacesContext实例中添加一条错误消息,然后直接跳向 Render Response Phase阶段,附带着错误消息,页面再此被渲染,如果有在 Apply Request Values Phase阶段产生的转换错误,这类消息也在当前这个阶段显示于页面之上。
任何 validate方法或者事件监听器调用了当前 FacesContext的 renderResponse方法, JSF实现框架跳至 Render Response Phase阶段。
这个时候,如果应用需要跳转至 Non-Faces Response组件、页面或者其他应用,可以调用 FacesContex.responseComplete方法。如果事件已经被放入队列, JSF实现框架广播这些事件给感兴趣的监听器。
JSF实现 框架 检查 数据是有效之后,会遍 历组 件 树,用组件的本地值去设 置相 应 的服 务 端 对 象属性。 JSF 实现 框架只会用表 单输 入 组 件的 值去更新 Bean 的属性。如果本地 值 不能 转 化成 bean 中特定的 Java 类 型,直接跳向 Render Response Phase 阶段,所以页面会渲染错误消息。这种情况类似于检验错误的发生。
如果任何 updateModels方法或者任何监听器调用了 renderResponse, JSF实现框架跳向 Render Response Phase阶段。
这个时候,如果应用需要跳转至 Non-Faces Response组件、页面或者其他应用,可以调用 FacesContex.responseComplete方法。如果事件已经被放入队列, JSF实现框架广播这些事件给感兴趣的监听器。
这 个 阶 段, JSF实现 框架 才开始处理应用级别的事件,比如表单提交或者链接至另外一个页面。
这个时候,如果应用需要跳转至 Non-Faces Response组件、页面或者其他应用,可以调用 FacesContex.responseComplete方法。
如果正在被处理的页面是从前一个请求状态信息重构而来,页面上的一个组件触发一个事件,这些事件被广播到感兴趣的监听器。
这 个 阶 段种,如果 WEB应 用使用 JSP技术 , JSF实现 框架代理渲染 页 面 给 JSP容器。如果是初始 请 求, 页 面上的 组 件将被添加到 组 件 树 中,作 为 JSP容器 执 行。如果不是初始 请 求, 页 面上的 组 件早已 经被添加到组件树之中,不需要被再此添加。随后,这些组件被渲染成JSP容器可识别的页面标签。
假如是提交请求,在Apply request values phase, process validation phase 或者 update model phase有错误发生,原始页面已经被渲染。假使页面上有 message或者 messages标签,排队的错误消息会显示在页面上。
视图的内容被渲染之后,随后响应的状态被保存,以保证子请求序列能存储之,并对 Restore View Phase这个阶段可用。