我有以下代码,其中一个简单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 updates model value with old value类似,但我有JSF @ManagedBean
注释。
答案 0 :(得分:2)
动作侦听器按照它们在视图中定义的顺序调用。您想使用action
代替actionListener
。更重要的是,action
应首先用于调用业务操作。
<p:commandLink action="#{testBean.test}" update="text">
<f:setPropertyActionListener target="#{testBean.index}" value="5" />
<h:graphicImage url="/images.png"/>
</p:commandLink>
答案 1 :(得分:0)
正在发生的事情是test
ActionEvent在应用请求值之前被触发。
为了更好地理解JSF阶段生命周期以及生命周期事件和ActionEvent何时触发,请按照以下博客文章中的说明实现Debug PhaseListener。
http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html
这可以帮助您了解何时应用请求值以及何时触发事件。