第六周:Life Cycle(JSF & Facelets)

一、Life Cycle Of  JSF 

JSF(JavaServer Faces)应用程序的生命周期从客户端对页面发出HTTP请求时开始,并在服务器响应页面时结束。

JSF生命周期分为两个主要阶段:

  • 执行阶段
  • 渲染阶段

下图为JSF生命周期的各个阶段:

1. 执行阶段

在执行阶段,当第一次请求时,构建或恢复应用程序视图。 对于其他后续请求,执行其他操作,如应用请求参数值,对组件值执行转换和验证,受托管的bean将使用组件值进行更新,并调用应用程序逻辑。
执行阶段被进一步分成以下子阶段。

  • 恢复视图阶段
  • 应用请求值阶段
  • 流程验证阶段
  • 更新模型值阶段
  • 调用应用阶段
  • 渲染响应阶段

恢复视图阶段

当客户端请求一个JavaServer Faces页面时,JavaServer Faces实现开始恢复视图阶段。 在此阶段,JSF将视图中的组件构建为请求页面,线性事件处理程序和验证器的视图,并将视图保存在FacesContext实例中。

如果对该页面的请求是回发,那么与该页面相对应的视图已经存在于FacesContext实例中。 在此阶段,JavaServer Faces实现通过使用保存在客户端或服务器上的状态信息来还原视图。

应用请求值阶段

在此阶段,在回发请求期间恢复组件树。 组件树是表单元素的集合。树中的每个组件通过使用其decode(processDecodes())方法从请求参数中提取其新值。 之后,该值将本地存储在每个组件上。

  • 如果任何解码方法或事件侦听器在当前FacesContext实例上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果任何事件在此阶段已排队,则JavaServer Faces实现将事件广播到有兴趣的监听器。
  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

流程验证阶段

在此阶段,JavaServer Faces通过使用其validate()方法来处理在组件上注册的所有验证器。 它检查指定验证规则的组件属性,并将这些规则与为组件存储的本地值进行比较。 JavaServer Faces还完成了没有将immediate属性设置为true的输入组件的转换。

  • 如果任何验证方法或事件侦听器在当前FacesContext上调用了renderResponse方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果应用程序需要重定向到不同的Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete方法。
  • 如果事件在此阶段已排队,则JavaServer Faces实现将它们广播给有兴趣的监听器。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

更新模型值阶段

确保数据有效后,它遍历组件树,并将相应的服务器端对象属性设置为组件的本地值。 JavaServer Faces实现只更新输入组件的value属性指向bean属性。 如果本地数据无法转换为bean属性指定的类型,生命周期将直接前进到“渲染响应”阶段,以便重新呈现页面并显示错误。

  • 如果任何updateModels方法或任何监听器在当前FacesContext实例上调用了renderResponse()方法,则JavaServer Faces实现将跳过“渲染响应”阶段。
  • 如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JavaServer Faces组件的响应,则可以调用FacesContext.responseComplete()方法。
  • 如果任何事件在此阶段已排队,JavaServer Faces实现将它们广播到有兴趣的监听器。
  • 如果当前请求被识别为部分请求,则从FacesContext检索部分上下文,并应用部分处理方法。

调用应用阶段

在此阶段,JSF处理应用程序级事件,例如提交表单或链接到另一个页面。
现在,如果应用程序需要重定向到其他Web应用程序资源或生成不包含任何JSF组件的响应,则可以调用FacesContext.responseComplete()方法。

之后,JavaServer Faces实现将控制转移到“渲染响应”阶段。

渲染响应阶段

这是JSF生命周期的最后阶段。 在此阶段,JSF将构建视图并将权限委托给相应的资源来呈现页面。

  • 如果这是初始请求,则页面上表示的组件将被添加到组件树中。
  • 如果这不是初始请求,组件已经添加到树中,不需要再添加。
  • 如果请求是回应,并且在应用请求值阶段,过程验证阶段或更新模型值阶段期间遇到错误,则在此阶段将再次呈现原始页面。

如果页面包含h:messageh:messages标签,页面上会显示任何排队的错误消息。
在渲染视图的内容之后,保存响应的状态,以便后续请求可以访问它。 恢复视图阶段可以使用保存的状态。

2. 渲染阶段

在此阶段,请求的视图作为对客户端浏览器的响应。 视图渲染是以HTML或XHTML生成输出的过程。 所以,用户可以在浏览器看到它。

在渲染过程中采取以下步骤。

  1. 当客户端对index.xhtml网页进行初始请求时,编译应用程序。
  2. 应用程序在编译后执行,并为应用程序构建一个新的组件树,并放置在FacesContext中。
  3. 使用由EL表达式表示的组件和与其关联受托管bean属性填充组件树。
  4. 基于组件树。 建立了新的视图。
  5. 该视图作为响应呈现给请求客户端。
  6. 组件树被自动销毁。
  7. 在后续请求中,重新构建组件树,并应用已保存的状态。

二、Life Cycle Of  Facelets 

JSF规范定义了JavaServer Faces应用程序的生命周期。以下步骤为基于 Facelets 的应用程序的过程描述。 

  1. 生命周期是在客户端使用Facelets创建的网页发出新请求时启动。 JSF创建一个新的组件树或javax.faces.component.UIViewRoot并放入FacesContex

  2. 如果可用的UIViewRoot应用于Facelets, 视图可以填充组件进行渲染。

  3. 新建的视图作为对客户端的响应而被渲染。

  4. 在渲染时,存储此视图的状态用于下一个请求。 存储输入组件和表单数据的状态。

  5. 客户端可以与视图交互,并从JSF应用程序请求另一个视图。 此时,保存的视图从存储状态恢复。

  6. 恢复视图再次通过JSF生命周期,如果没有验证问题,并且没有触发任何操作,最终将生成新视图或重新呈现当前视图。

  7. 如果请求相同的视图,则再次呈现存储的视图。

  8. 如果要求新视图,则继续执行【步骤2】。

  9. 将新视图作为对客户端的响应。

 

原文地址:https://www.cnblogs.com/MnineJane/p/8854207.html