在JSF1.2中,标签<f:view>中添加了beforePhase、afterPhase两个属性,这两个属性有什么用呢?本文就是来说明这个问题。
首先来看代码:
<f:view beforePhase="#{userList.init}"> <h:form> <h:dataTable border="1" value="#{userList.users}" var="usr" binding="#{userList.data}"> <h:column id="column1"> <f:facet name="header"> <h:outputText value="Name"></h:outputText> </f:facet> <h:outputText value="#{usr.name}"></h:outputText> </h:column> <h:column id="column2"> <f:facet name="header"> <h:outputText value="Age"></h:outputText> </f:facet> <h:outputText value="#{usr.age}"></h:outputText> </h:column> <h:column id="column3"> <f:facet name="header"> <h:outputText id="text3" value="Birthday"></h:outputText> </f:facet> <h:outputText value="#{usr.birthday}"></h:outputText> </h:column> <h:column id="column4"> <f:facet name="header"> <h:outputText id="text4" value="Gender"></h:outputText> </f:facet> <h:outputText value="Male" rendered="#{usr.gender}"></h:outputText> <h:outputText value="Female" rendered="#{!usr.gender}"></h:outputText> </h:column> <h:column id="column5"> <f:facet name="header"> <h:outputText id="text5" value="Email"></h:outputText> </f:facet> <h:outputText value="#{usr.email}"></h:outputText> </h:column> <h:column id="column6"> <f:facet name="header"> <h:outputText id="text6" value="Country"></h:outputText> </f:facet> <h:outputText value="#{usr.country}"></h:outputText> </h:column> <h:column id="column7"> <f:facet name="header"> <h:outputText id="text7" value="Operation"></h:outputText> </f:facet> <h:commandLink value="Update" action="#{userList.update}" ></h:commandLink> <h:commandLink value="Delete"></h:commandLink> </h:column> </h:dataTable> </h:form> </f:view>
我们在这个页面上显示一个Datatable,在f:view中使用beforePhase,设为userList.init,下面来看user.init方法:
public void init(PhaseEvent phaseEvent) {
if (users.size() == 0) {
for (int i = 0; i < 10; i++) {
User user = new User();
user.setName("Peter");
user.setAge(i * 2 + 1);
user.setBirthday(new Date());
user.setCountry("China");
user.setEmail("as" + i + "@sina.com");
if (i % 2 == 0)
user.setGender(true);
else
user.setGender(false);
user.setIntroduction("Hello,Every One!");
users.add(user);
}
}
System.out.println("total users are: " + users.size());
}
在这段代码中,初始化了DataTable中的数据,也就是页面中的数据,下面是页面执行时候打印出来的生命周期记录:
Processing a new Request!
Before Phase: RESTORE_VIEW 1
After Phase: RESTORE_VIEW 1
Before Phase: RENDER_RESPONSE 6
total users are: 10
After Phase: RENDER_RESPONSE 6
End JSF Request!
可以看出,user.init方法字啊第六个阶段的开始被执行,因此我们可以认为,beforePhase方法相当于注册一个PhaseListener,并且专门在本页面生效,因此也相当于JSP中的Page scope的效果,解决了JSF1.1开发中遇到的Page Scope的问题