【问题标题】:JSF GAE: Value Update Problem in managed bean methodJSF GAE:托管 bean 方法中的值更新问题
【发布时间】:2011-09-09 12:36:49
【问题描述】:

我有以下一段代码,其中包含一个简单的 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 注释。

【问题讨论】:

    标签: java google-app-engine jsf primefaces


    【解决方案1】:

    动作监听器按照它们在视图中定义的顺序被调用。您想使用action 而不是actionListener。更重要的是,action 应该首先用于调用业务操作。

    <p:commandLink action="#{testBean.test}" update="text">
        <f:setPropertyActionListener target="#{testBean.index}" value="5" />
        <h:graphicImage url="/images.png"/>
    </p:commandLink>
    

    另见:

    【讨论】:

      【解决方案2】:

      发生的情况是test ActionEvent 在应用请求值之前被触发。

      为了更好地了解 JSF 阶段生命周期以及生命周期事件和 ActionEvents 何时触发,请按照以下博客文章中的说明实现 Debug PhaseListener。

      http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html

      这应该有助于您了解何时应用请求值以及何时触发事件。

      【讨论】:

      • 这其实不是真的。 f:setPropertyActionListener 不发送请求参数。它只是另一个动作监听器。
      猜你喜欢
      • 2015-03-11
      • 2012-03-24
      • 2014-07-02
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      • 2014-07-06
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多