JSF页面生命周期管理
当用户请求页面时,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。
在此示例中,它是一个页面,其中所有字段都设置为空白值。