JSF GAE:托管bean方法中的值更新问题

时间:2011-09-09 12:36:49

标签: java google-app-engine jsf primefaces

我有以下代码,其中一个简单h:outputText指向intp: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注释。

2 个答案:

答案 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

这可以帮助您了解何时应用请求值以及何时触发事件。