selectOneMenu上的valueChangeListener和ajax执行顺序问题

时间:2011-04-18 03:57:33

标签: jsf jsf-2

我目前遇到一种奇怪的现象,在执行valueChangeListener之前,将值设置为模型。

基本上我想要发生的是:

  1. 我更改了选择菜单
  2. 使用Ajax提交新值以更新myBean(使用f:ajax)
  3. 根据新提交的值(使用valueChangeListener)
  4. 执行查询
  5. 根据上次查询的结果呈现表格
  6. 但是当我按照这个顺序运行时会发生什么,1 - 3 - 2 - 4(不是我认为的1 - 2 - 3 - 4)

    这是UI的一部分:

    <h:selectOneMenu label="budget" id="budget"
        converter="genericConverter"
        value="#{myBean.budget}" 
        valueChangeListener="#{myBean.actionSearch}">
    
        <f:ajax render="myGrid" />
        <f:selectItem itemLabel="Choose one .." noSelectionOption="true" />
    
        <f:selectItems ... />
    </h:selectOneMenu>
    

    这是豆子的摘录:

    public void actionSearch() {
        System.out.println("searching with this.budget == " + this.budget);
        ...
    }
    public void setBudget(String budget) {
        System.out.println("setting budget : " + budget);
        this.budget = budget;
    }
    

    这是输出:

    searching with this.budget == xxxx
    setting budget : yyyy
    

    我想要的是,首先从UI中选择的新值设置预算,然后根据新UI开始搜索。但我不知道如何实现这一点。

    我正在使用Tomcat 7以及:

    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.0.4-b09</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.0.4-b09</version>
        <scope>compile</scope>
    </dependency>
    

    我不知道我做错了什么?

    谢谢!

1 个答案:

答案 0 :(得分:15)

valueChangeListener在验证阶段执行,更新模型值阶段之前执行。它的目的是能够获得两者旧值和新值的处理,以便您可以根据真实更改在必要时执行一些业务(日志记录?) 。但是,在JSF 1.x中,这通常(ab)用于仅对下拉列表更改调用操作,但它必须与onchange="submit()"immediate="true"FacesContext#renderResponse()结合使用和其他东西。所选值将由ValueChangeEvent#getNewValue()获得(ValueChangeEvent应该被定义为方法的参数)。

对于JSF 2.x,在这种情况下你不再需要valueChangeListener。无论如何,你对旧的价值也不感兴趣。请改用<f:ajax>listener属性。

<f:ajax listener="#{bean.actionSearch}" />

这将在Invoke Action阶段执行,更新模型值阶段后执行。