gpt4 book ai didi

jsf - JSF中的Valuechangelistener怀疑

转载 作者:行者123 更新时间:2023-12-04 09:07:50 26 4
gpt4 key购买 nike

你好,

请看以下代码:

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

bean 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 提交您的表格事件被触发(这是您在代码中所做的);
  • 改用 Ajax 调用,通过使用一些专用组件(已经集成在 JSF2 中,带有 <f:ajax> 或第三方库,例如 Richfaces、Primefaces...)。

  • 这是 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)一个Java类( type="com.foo.MyListenerClass"),它实现了 ValueChangeListener界面。所以第二个可能比第一个更通用......

    关于jsf - JSF中的Valuechangelistener怀疑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4801535/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com