你好,
请参见以下代码:
<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"));
}
}
请让我知道实现是否正确。一切正常。
我的问题是:
请给我解释一下。
最佳答案
仅在提交表单时才调用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
)。所以第二个可能比第一个更通用...