关键字: f:view beforephase的用法
在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>
<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());
- }
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的问题