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



我有以下一段代码,一个简单的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

这将帮助您理解何时应用请求值,以及何时触发事件。

相关内容

  • 没有找到相关文章

最新更新