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