在<f:ajax>上的“listener”属性上调用valueChangeListener方法时出错,因为event =“valueChange”</f:ajax>

时间:2013-02-20 11:06:55

标签: jsf-2

我正在使用以下规格:

JSF 2.0,带有JDK 1.6和Glassfish 3.1.2的Netbeans 7.1.2

以下是我的 index.xhtml 代码:

<h:form>
    <h:panelGrid columns="2">
        <h:outputText value="Select a country:" />
        <h:selectOneMenu id="countryBox" value="#{ab.selCountry}">
            <f:selectItem itemLabel="India" itemValue="India" />
            <f:selectItem itemLabel="United States of America" itemValue="USA" />
            <f:ajax execute="countryBox" render="stateBox" event="valueChange" listener="#{ab.result}"/>
        </h:selectOneMenu> 
        <h:outputText value="Select a state:" />
        <h:selectOneMenu value="#{ab.country}" id="stateBox">
            <f:selectItems value="#{ab.state}" />
        </h:selectOneMenu>
    </h:panelGrid>
</h:form>

这是我的 AJAXBean.java 代码:

@ManagedBean (name="ab")
@RequestScoped
public class AJAXBean {

    /**
     * Creates a new instance of AJAXBean
     */

    private List<SelectItem> country;
    private List<SelectItem> state;
    private String selCountry;

    // getters and setters of properties

    public AJAXBean() 
    {
        country = new ArrayList<SelectItem>();
        state = new ArrayList<SelectItem>();
    }

    public void result(ValueChangeEvent vce) // valueChangeListener for ajax call. Is this valid?
    {
        System.out.println("Inside valueChangeListener");

        String value = (String) vce.getNewValue();
        state.clear();

        if (value.equals("India"))
        {
            state.add(new SelectItem("Maharashtra"));
            state.add(new SelectItem("Madhya Pradesh"));
            state.add(new SelectItem("Andhra Pradesh"));
            state.add(new SelectItem("Uttar Pradesh"));
            state.add(new SelectItem("Rajasthan"));

        }
        else if (value.equals("USA"))
        {
            state.add(new SelectItem("Missouri"));
            state.add(new SelectItem("Kentucky"));
            state.add(new SelectItem("North Carolina"));
            state.add(new SelectItem("South Carolina"));
            state.add(new SelectItem("Colorado"));

        }
    }
}

基本上我在这里要做的是:

一个在event =“valueChange”和listener =“#{ab.result}”上激活一个AJAX调用。这里的结果方法修改了'state'列表(SelectItems)的值。

我的值的语法是否更改了侦听器方法?因为当我尝试执行此操作时,它会向我显示一个警告框,说明没有找到MethodNotFoundException +方法#{ab.beult(AJAXBehaviorEvent)},即它正在尝试搜索捕获AJAXBehaviorEvent对象的“result”方法。所以,我的问题是,当它与f:ajax调用一起使用时,值更改侦听器方法的签名是否有所不同?

PS:它试图使用#{ab.result()}。在这种情况下,它只是说MethodNotFoundException。 如果使用#{ab.result(vce)}而不是#{ab.result()} /#{ab.result},它会给我一个NullPointerException。

如果我在h:selectOneMenu的valueChangeListener属性中放入相同的函数,它就可以了。我的意思是,显然它会起作用。但这并不能解决我的目的。我的目的是对valueChange事件进行简单的ajax调用,该事件更新bean中的列表并重新呈现(第二个)链接的h:selectOneMenu作为结果

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

听取你的例外情况。它说它无法找到AjaxBehaviorEvent参数的方法。通过ValueChangeEvent参数更改AjaxBehaviorEvent参数。

public void result(AjaxBehaviorEvent event) {
    // ...
}

而不是ValueChangeEvent#getNewValue(),只需直接访问selCountry

顺便说一句,event="valueChange"已经是默认设置。只需摆脱它以减少代码噪音。

另见: