基于h:selectOneMenu值调用两个不同的函数

时间:2012-03-09 06:05:12

标签: java ajax jsf jsf-2

我正在使用MyFaces 2.0.12和RichFaces 3.3.3。当用户更改Session scope的选择时,我需要在BackBean(h:selectOneMenu)中调用两个不同的函数。以前我做过如下:

    <h:selectOneMenu
         value="#{customer.recordsDisplayed}"                                       
        valueChangeListener="#{customer.onRecordsPerPageChange}"
        onchange="submit()"
        <f:selectItems value="#{customer.rppValues}" />
    </h:selectOneMenu>

并在backbean中:

    public void onRecordsPerPageChange(ValueChangeEvent vce){

        if(this.searchFlagAdvance)
            searchMethodA();
        else
            searchMethodB();
    }

我理解上述内容是错误的,因为您不打算在ValueChangeEvent阶段调用逻辑或更改backbean值

所以我的问题是什么是正确的方法?因为上面的代码我进入了backbean值为null并且整个事情变得平坦的场景。

UPDATE:

我将代码更改为以下内容并且完美无缺。我只是想知道以下是不是很好的做法。

    public void onRecordsPerPageChange(ActionEvent event) {
         String value =(String) ((EditableValueHolder) event.getComponent().getParent()).getValue();

         this.value = value;
         if(searchFlagA)
            searchMethodA();
        else
            searchMethodB();
    }

并将JSP代码更改为:

    <h:selectOneMenu
         id="selectRecordDisplay"
         value="#{customer.recordsDisplayed}"                         
        <f:selectItems value="#{customer.rppValues}" />
        <a4j:support event="onchange" actionListener="#{customer.onRecordsPerPageChange}" reRender="pangelgrid"></a4j:support> 
    </h:selectOneMenu>

1 个答案:

答案 0 :(得分:2)

由于您使用的是JSF 2.0,因此可以使用ajax:

<h:selectOneMenu value="#{customer.recordsDisplayed}">
  <f:selectItems value="#{customer.rppValues}" />
  <f:ajax action="#{customer.onRecordsPerPageChange}" 
          execute="idsToBeProcessed"
          render="idsToBeRendered"/>
</h:selectOneMenu>

使用follogin操作方法:

public void onRecordsPerPageChange(AjaxBehaviorEvent event) {
 ...
}

execute属性列表中,需要在服务器端处理的所有组件的id(空格分隔),尤其是侦听器方法所依赖的组件。当{a}参数返回时,render属性将获取需要重新呈现的所有组件ID。如果将@form放在一个或两个属性中,则将处理/呈现整个表单。