你好,

请参见以下代码:

                <h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" onchange="submit()
                                    valueChangeListener="#{countryBean.changeCountry}">
                    <f:selectItems value="#{countryBean.countries }" />
                </h:selectOneMenu>

后备 bean
public void changeCountry(ValueChangeEvent event){
    String newValue = (String)event.getNewValue();
    String oldValue = (String)event.getOldValue();

    System.out.println("New Value : " + newValue);
    System.out.println("Old Value : " + oldValue);

    if ("1".equals(newValue)){
        this.countries = new ArrayList<SelectItem>();
        this.cities.add(new SelectItem("1","Delhi"));
        this.cities.add(new SelectItem("2","Mumbai"));
    }
    if ("2".equals(newValue)){
        this.cities = new ArrayList<SelectItem>();
        this.cities.add(new SelectItem("1","Mossco"));
    }
}

请让我知道实现是否正确。一切正常。
我的问题是:
  • 在h:selectOneMenu标签内添加f:valueChangeListener标签的好处是什么。我使用了普通属性valueChangeListener =“#{countryBean.changeCountry}”。
  • 是否需要使用onchange =“submit()此代码来更改值。
  • 通过实现ActionListener接口(interface)编写自定义监听器与仅使用UIComponent标记中的属性(action =“methodName”)有什么区别。
    请给我解释一下。
  • 最佳答案

    仅在提交表单时才调用ValueChangeListener,而不是在更改输入值时调用。因此,如果要在修改值后运行此监听器,则有两种解决方案:

  • 在触发onchange事件时提交表单(这是您在代码中所做的事情);
  • 通过使用一些专用组件(已经与<f:ajax>集成在JSF2中,或诸如Richfaces,Primefaces等第三方库中)来使用Ajax调用。

  • 这是Richfaces的示例:
    <h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" valueChangeListener="#{countryBean.changeCountry}">
        <a4j:support event="onchange" .../>
        <f:selectItems value="#{countryBean.countries }" />
    </h:selectOneMenu>
    

    关于您的监听器的代码,这似乎是正确的,但是为什么要问为什么在这里需要ValueChangeListener?确实,当您要跟踪值的修改时,此监听器很有用。这就是ValueChangeEvent同时提供getOldValue()getNewValue()方法的原因。

    在您的代码中,您不必关心旧值,因此,基本上,您可以“简单地”执行操作而不是valueChangeListener(例如Richfaces):
    <h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}">
        <a4j:support event="onchange" actionListener="#{countryBean.changeCountry}"/>
        <f:selectItems value="#{countryBean.countries }" />
    </h:selectOneMenu>
    

    最后,关于valueChangeListener属性和<f:valueChangeListener>之间的区别是,第一个绑定(bind)一个Java方法(#{myBean.myMethod}),而第二个绑定(bind)一个实现type="com.foo.MyListenerClass"接口(interface)的Java类(ValueChangeListener)。所以第二个可能比第一个更通用...

    10-07 19:11