我有以下一段代码,一个简单的h:outputText
指向一个int
和一个p:commandLink
来设置一个值:
<h:form id="f1">
<h:outputText id="text" value="#{testBean.index}"/>
<p:commandLink actionListener="#{testBean.test}" update="text">
<f:setPropertyActionListener target="#{testBean.index}" value="5" />
<h:graphicImage url="/images.png"/>
</p:commandLink>
</h:form>
托管bean看起来像这样:
@javax.faces.bean.ManagedBean @ViewScoped
public class TestBean implements Serializable{
private int index; // getter/setter
@PostConstruct public void init() {
index = 0;log.log(Level.WARNING, "@PostConstruct");}
public void test(ActionEvent ae){
log.log(Level.WARNING, "Index: "+index);}
}
bean构造正确,在第一次单击图像之后,h:ouputText
更新为5。但是在我的日志消息中,我只在第一次点击图像时看到Index: 0
。
这类似于Jsf用旧值更新模型值,但我有Jsf @ManagedBean
注释。
操作侦听器将按照在视图中定义的顺序调用。您希望使用action
而不是actionListener
。更重要的是,action
应该首先用于调用业务操作。
<p:commandLink action="#{testBean.test}" update="text">
<f:setPropertyActionListener target="#{testBean.index}" value="5" />
<h:graphicImage url="/images.png"/>
</p:commandLink>
参见:
- action和actionListener的区别
发生的事情是test
ActionEvent在请求值被应用之前被触发。
为了更好地理解JSF阶段生命周期,以及生命周期事件和ActionEvents何时触发,请实现以下博客文章中指定的Debug PhaseListener。
http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html这将帮助您理解何时应用请求值,以及何时触发事件。