JSF页面生命周期管理

时间:2020-02-23 14:33:44  来源:igfitidea点击:

当用户请求页面时,JSF的生命周期开始。
JavaServer faces从先前保存的状态构建当前视图,而先前保存的状态实际上是从上一页提交的状态开始的。
该框架执行某些任务,例如验证页面的输入字段,生成响应等。

JSF生命周期涉及六个阶段,即

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

让我们详细查看这些阶段中的每个阶段。

  • 恢复视图阶段:每当请求到达时,这就是启动的第一个阶段。
    当请求到达时-即单击按钮或者链接时,jsf会构建视图,准备事件处理程序,验证ui组件并将视图保存在faces上下文中。
    此面孔上下文将具有先前请求的所有信息,以处理当前请求。
    如果请求是最初的请求,那么JSF将创建一个空视图,并在回发期间将其显示给用户。
    如果回发视图已经存在,则该信息将从已保存状态弹出。

  • 应用请求值:从第一阶段恢复组件后,每个组件都会提取其新值,该新值可能已通过解码方法从先前状态更改了。
    然后将提取的值与组件一起存储在本地(本机数据类型)。
    如果解码过程失败,则会生成错误消息并将其存储在face上下文中,以采取进一步的措施。
    如果组件在页面中将其直接JSF属性设置为true,则将处理与页面相关的事件,验证和转换。
    如果有任何解码方法调用渲染响应阶段,则控件将重定向到渲染响应阶段本身。

如果应用程序需要重定向到其他应用程序,则可以调用FacesContext.responseComplete。
在此阶段结束时,将设置新值,并将消息,事件排队。

  • 流程验证阶段:在此阶段中,将处理所有与字段相关的验证,并将其添加到组件树中。
    将检查每条规则,并将其与本地组件上存储的值进行比较。
    如果本地组件上的值无效,则会在faces上下文中注册错误消息,并通过导航到渲染响应阶段再次在同一页面上显示该错误消息。

  • 更新模型值阶段:由于数据验证是在验证阶段完成的,因此现在已设置了相应的服务器对象属性并将其存储在本地组件中。
    Bean属性将更新为相应的输入组件属性。

  • 调用应用程序阶段:在此阶段中处理诸如提交表单,单击链接之类的事件。
    如果基于先前请求的状态信息重构了处理后的视图,并且如果触发了事件,则将其广播给感兴趣的侦听器。
    如果再次调用重定向到另一个Web应用程序,则将过渡到响应呈现阶段。

  • 渲染响应阶段:Java Server Faces首先检查它是否为jsp页面,如果是,则将控件转移到JSP容器。
    如果请求是初始请求,则该页面首先添加到组件树并存储。
    如果不是初始请求,则该组件将已经存储,因此将被渲染。
    无论哪种情况,组件都将在JSP容器遍历页面中的标记时呈现。
    如果在此过程中遇到任何错误,则会显示相关消息。
    呈现视图后,将存储内容,以便在同一请求到达时可以对其进行访问,并且还可以用于还原视图阶段。

让我们考虑一个例子来理解每个阶段。

呈现页面,用户可以其中输入汽车详细信息,例如汽车ID,名称,颜色,型号等,然后输入的详细信息将显示在浏览器中。

" addDetailsPage.xhtml"包含用户可其中输入详细信息的汽车的所有字段。
addDetailsPage的代码如下。

addDetailsPage.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml"
    xmlns:h="https://xmlns.jcp.org/jsf/html">
  <h:head>
      <title>Facelet Title</title>
  </h:head>
  <h:body>
      <h:form>
          <h:panelGrid columns="3">
              <h:outputLabel>Car Id:</h:outputLabel>
              <h:inputText id="cid" value="#{car.id}"></h:inputText>
          <br  <br 
          <h:outputLabel>Car Name:</h:outputLabel>
          <h:inputText id="cname" value="#{car.cname}"></h:inputText>
          <br  <br 
          <h:outputLabel for="color">Car color:</h:outputLabel>
          <h:inputText id="color" value="#{car.color}"></h:inputText>
          <br  <br 
          <h:commandButton value="Reset"  action="#{car.clearAll}"></h:commandButton>
          </h:panelGrid>
      </h:form>
      </h:body>
</html>

如下所示创建一个Managed Bean Car.java。

package com.theitroad.jsf.beans;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Car {
  private String cname;
  private String Id;
  private String color;
  public String getColor() {
      return color;
  }

  public void setColor(String color) {
      this.color = color;
  }

  public String getCname() {
              return cname;
  }

  public void setCname(String cname) {
      this.cname = cname;
  }

  public String getId() {
      return Id;
  }

  public void setId(String Id) {
      this.Id = Id;
  }
  
  public void clearAll(){
    this.Id = "";
    this.cname = "";
    this.color="";
}    
}

假设用户在浏览器中输入https://localhost:8080/HelloWorld/faces/addDetailsPage.xhtml。
以下是执行步骤。

步骤1:由于这是初始请求,因此无法还原,因此创建了一个空视图,并将其发回。

步骤2:在此设置用户输入的用于汽车详细信息的值,例如汽车ID = 3,名称=" Alto"和颜色=" blue"。

步骤3:在此检查与汽车ID,名称和颜色有关的验证。
由于没有设置验证,因此此处不进行任何处理。
假设我们将car id设为必填项,并提交car id为null的页面,验证器将生成错误消息,并进行到最后一步,即渲染响应。

步骤4:在模型阶段,将提取页面中的值并将其插入到car bean中的相应变量中。
清除全部方法已映射,如果需要,清除全部功能在此处完成。

步骤5:在此单击"重置"按钮。
在此处构造要渲染的视图。
这是在步骤4中触发功能的结果。
例如,当我们清除字段时,将执行bean方法,并使用所有字段值都设置为null的新视图。

步骤6:呈现具有最终结果和字段值的视图页面addDetailsPage.xhtml。
在此示例中,它是一个页面,其中所有字段都设置为空白值。