【问题标题】:JSF Lifecycle performed 2 times with PrimeFaces ajaxJSF Lifecycle 使用 PrimeFaces ajax 执行 2 次
【发布时间】:2012-07-21 15:21:13
【问题描述】:

我在 WebSphere Application Server 上使用 PrimeFaces 3.3.1 和 Apache MyFaces 2。 我的 BackingBean 是 SessionScoped。 我有一个带有 selectOneButton 的表单应该更新整个表单。

<h:form id="options">
    <p:panelGrid>
        <p:column rowspan="2" style="width:115px;">
            <p:selectOneButton value="#{graph.diagramdata}" id="diagramdata">           
                <f:selectItem itemLabel="WAS-Diagramm" itemValue="1" />
                <f:selectItem itemLabel="PSC-Diagramm" itemValue="2" />
                <p:ajax listener="#{graph.changeView }" update=":options"/>
            </p:selectOneButton>
            <h:outputText>#{graph.diagramdata}</h:outputText>
        </p:column>
        <p:column rendered="#{graph.diagramdata eq '1' }">
          ...
        </p:column>
    </p:panelGrid>
</h:form>

编辑:支持豆的一部分

@ManagedBean(name = "graph")
@SessionScoped
public class MyGraphBean implements Serializable {
  private int diagramdata;

  public void changeView(AjaxBehaviorEvent event) {
      LOGGER.info(this.getDiagramData());   
  }

  public int getDiagramdata() {
    return diagramdata;
  }

  public void setDiagramdata(int diagramdata) {
    if(diagramdata == 1 || diagramdata == 2) {
      this.diagramdata = diagramdata;
    }
  }
}

但是当我更改一个值时,jsf 生命周期会执行 2 次。 第一次 in.getValue 为空,第二次为 1 或 2(来自 LOGGER)。 但最后我的 h:outputText 打印 0...

为了调试,我使用BalusC: Debug JSF Lifecycle

为什么要执行 2 次 Lifecycle?

如何使用我的 selectOneButton 正确呈现其他列?

编辑:肮脏的解决方案

我找到了解决问题的方法(非常脏!!!)。 我将 p:ajax 组件更改为 f:ajax。 所以现在我的值在第二个生命周期阶段被设置为正确的值。

<p:selectOneButton value="#{graph.diagramdata}" id="diagramdata">           
      <f:selectItem itemLabel="WAS-Diagramm" itemValue="1" />
      <f:selectItem itemLabel="PSC-Diagramm" itemValue="2" />
      <f:ajax listener="#{graph.changeView }" render="options"/>
</p:selectOneButton>

我还在我的 setter 方法中添加了一个 if 语句以避免设置“0”。

现在第一个 jsf 生命周期什么都不做,第二个设置我的值。

它可以工作,但不是很好......

【问题讨论】:

  • 你能发布更多你的backing bean吗?例如你引用了 in.getValue,但你还没有在此处发布该代码。
  • 我添加了backing bean的部分

标签: java ajax jsf-2 primefaces


【解决方案1】:

你那里的onchange="submit()" 是什么?是否有机会提交表单?如果是这样,请将其删除...

另外,您确定需要immediate="true" 您打算跳过验证吗?

【讨论】:

  • 我删除了两个标签,但现在输入值都是 "0" ,当我第二次按下按钮时它起作用了
  • 看看这个:删除 changeView 方法中的所有代码并放置 System.out.println(getDiagramdata(); 看看正确的值吗?
  • 我编辑了我的 changeView 方法。 JSF 生命周期也执行了 2 次。两次我的值都是“0”。
  • 您的图形 bean 的范围是什么?如果请求,则将其更改为查看范围
  • 它的会话范围,我也尝试了视图范围但同样的问题
【解决方案2】:

看起来像是 PrimeFaces selectOneButton 的错误。 当我使用例如p:selectOneMenu 它适用于 1 个 JSF 生命周期!

这是来自 primefaces 的已知 issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2023-03-06
    • 2011-04-05
    • 2023-03-29
    • 2014-05-14
    相关资源
    最近更新 更多