天天看点

JSF中request请求的生命周期

 1、恢复视图 :恢复用户所请求的视图的状态,状态的信息可能来自request也可能存在于服务器端,如果没有视图状态, 则予以重建。 倘若先前曾经调用过saveState()方法来存储状态信息,则必须在此阶段调用组件的restoreState()方法。

  2、应用请求值: 在本阶段,UIVIewRoot组件的processDecodes()方法会被调用,该方法再递归调用组件树里任何rendered属性为true的组件的同名方法,个别组件在该方法里面会调用组件自己或者所搭配的renderer的decode()方法;对于输入组件而言,其decode()方法的作用是 设定组件的submittedValue属性,若输入组件的immediate属性为true,则调用validate()方法来转换、验证提交值,若转换后的值不同于前一次的值,则validate()方法会添加一个ValueChangeEvent事件到队列中。

       若发现提交的值不正确,则添加一个错误信息到队列,并调用FacesContext的renderResponse()方法。

       对于命令组件而言,如果request恰好是自己触发的,则其decode()方法会添加一个ActionEvent事件到队列。

       在本阶段的最后,所有被标示为需要处理的事件(不管发生于哪一个阶段),其来源组件的broadcast()会被调用一次,借此通知它们的event handler。收到通知的event handler有可能会选择另一个视图,也可能自己产生响应视图。若是前者,它们会调用FacesContext的renderResponse()方法,对于后者,它们会调用FacesContext的responseComplete()方法,改方法会结束request处理过程。

  3、处理验证: 在本阶段,UIViewRoot组件的processValidators()方法会被调用,该方法会递归调用组件树里任何rendered属性为true的组件的同名方法。

        对于输入组件而言,其processValidators()方法会调用组件自己的validate()方法,当该方法发现验证过的值不同于前一次的值,则会添加一个ValueChangeEvent事件到队列中。

        若发现提交的值不正确,则添加一个错误信息到队列,并调用FacesContext的renderResponse()方法。

        在本阶段的最后,所有被标示为需要处理的事件(不管发生于哪一个阶段),其来源组件的broadcast()会被调用一次,借此通知它们的event handler。收到通知的event handler有可能会选择另一个视图,也可能自己产生响应视图。若是前者,它们会调用FacesContext的renderResponse()方法,对于后者,它们会调用FacesContext的responseComplete()方法,改方法会结束request处理过程。

 4、更新模型值: 在本阶段,UIViewRoot组件的processUpdatess()方法会被调用,该方法会递归调用组件树里任何rendered属性为true的组件的同名方法。

       对于输入组件而言,它们的processUpdates()方法会调用组件自己的updateModel()方法,借此将组件的local value设定给组件所绑定的应用程序对象的属性,如果不能设定模型属性,则会添加一个错误信息到队列,并调用FacesContext的renderResponse()方法。

        在本阶段的最后,所有被标示为需要处理的事件(不管发生于哪一个阶段),其来源组件的broadcast()会被调用一次,借此通知它们的event handler。收到通知的event handler有可能会选择另一个视图,也可能自己产生响应视图。若是前者,它们会调用FacesContext的renderResponse()方法,对于后者,它们会调用FacesContext的responseComplete()方法,改方法会结束request处理过程。

5、 触发后台程序: UIViewRoot组件的processApplication()方法会被调用,该方法会检查每个标示为需要处理的事件(不管发生于哪一个阶段),  其来源组件的broadcast()会被调用一次,借此通知它们的event handler。收到通知的event handler有可能会选择另一个视图,也可能自己产生响应视图。若是前者,它们会调用FacesContext的renderResponse()方法,对于后者,它们会调用FacesContext的responseComplete()方法,改方法会结束request处理过程。

6、 绘制响应视图: 组件的saveState()方法有可能在此阶段被调用,而整个组件树的完整状态也有可能被包含于response中(HTML隐藏字段)或者session中。

继续阅读