`

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>

 

我们在这个页面上显示一个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的问题

2
0
分享到:
评论
3 楼 hintcnuie 2008-05-24  
是这样子的,看下面的code:
public void init(PhaseEvent phaseEvent) {
System.out.println("Phase:"+ phaseEvent.getPhaseId());
System.out.println("execute init method...\n");

}
page:
<f:view beforePhase="#{loginBean.init}">
<f:loadBundle basename="com.bluedot.jsf.messages" var="msg"/>
<h:form>
<h:panelGrid border="1" columns="2">
<h:outputText value="#{msg.name}"></h:outputText>
<h:inputText value="#{loginBean.name}"></h:inputText>
<h:outputText value="#{msg.password}"></h:outputText>

<h:inputSecret value="#{loginBean.password}">
<f:validator validatorId="passwordValidtor"/>
</h:inputSecret>

</h:panelGrid>
<h:commandButton action="login" value="#{msg.login}"></h:commandButton>
<h:commandButton value="#{msg.reset}"></h:commandButton>
</h:form>
</f:view>
点击按钮时,会输出:
Phase:APPLY_REQUEST_VALUES 2
execute init method...

Phase:PROCESS_VALIDATIONS 3
execute init method...

Phase:UPDATE_MODEL_VALUES 4
execute init method...

Phase:INVOKE_APPLICATION 5
execute init method...
2 楼 yourenyouyu2008 2008-05-23  
beforePhase的方法在2-6每个阶段都会执行,但只是针对该页面,由于上面给的例子是直接响应的,所以只有6阶段执行了。
<f:phaseListener 标签和他实现相同的功能,并且可以添加到页面的任意地方,也可以指定执行的阶段。
1 楼 rockjava 2008-05-23  
用这种方法在页面有按钮提交事件的时候这个beforePhase="#{userList.init}"方法是不是还会被执行?

相关推荐

Global site tag (gtag.js) - Google Analytics