JSF Lifecycle使用PrimeFaces ajax执行了2次

时间:2012-07-23 11:32:36

标签: java ajax jsf-2 primefaces

我在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

为什么te生命周期会进行2次?

如何使用selectOneButton正确渲染其他列?

编辑:DIRTY SOLUTION

我找到了解决问题的方法(很脏!!!)。 我将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生命周期什么也没做,第二个设置我的值。

它有效,但不是很好......

2 个答案:

答案 0 :(得分:2)

你在那里onchange="submit()"是什么?是否有机会提交表格?如果是,那么删除它......

另外,您确定需要immediate="true"是否计划跳过验证?

答案 1 :(得分:1)

看起来像PrimeFaces selectOneButton的错误。 当我使用例如p:selectOneMenu它适用于1 JSF Lifecycle!

以下是来自primefaces的已知issue