首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF中的Valuechangelistener怀疑

JSF中的Valuechangelistener怀疑
EN

Stack Overflow用户
提问于 2011-01-26 05:01:42
回答 3查看 20.3K关注 0票数 7

嗨,

请参阅下列代码:

代码语言:javascript
复制
                <h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}" onchange="submit()
                                    valueChangeListener="#{countryBean.changeCountry}">
                    <f:selectItems value="#{countryBean.countries }" />
                </h:selectOneMenu>  

支持豆

代码语言:javascript
复制
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接口来编写自定义侦听器与仅使用UIComponent标记中的属性(action="methodName")有什么区别。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-26 08:19:34

只有在表单提交时才会调用ValueChangeListener,而不是当输入的值被更改时才调用。因此,如果要在修改该值时运行此侦听器,则有两个解决方案:

在触发Primefaces...).事件时,

  1. 提交表单(这是您在代码中所做的);
  2. 使用Ajax调用代替,方法是使用一些专用组件(已经集成到JSF2中,与<f:ajax>或第三方库(如Richfaces、
  3. )集成)。

下面是Richfaces的一个例子:

代码语言:javascript
复制
<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):

代码语言:javascript
复制
<h:selectOneMenu id="countries" value="#{countryBean.selectedCountry}">
    <a4j:support event="onchange" actionListener="#{countryBean.changeCountry}"/>
    <f:selectItems value="#{countryBean.countries }" />
</h:selectOneMenu>

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

票数 21
EN

Stack Overflow用户

发布于 2011-01-26 11:58:38

罗曼塔兹已经指出最多了,我只想直截了当地回答你的具体问题:

在h:selectOneMenu标记中添加f:valueChangeListener标记的优点是什么。我使用了普通属性valueChangeListener="#{countryBean.changeCountry}".

正如Romaintaz所说,属性指向一个方法,f:标记指向一个类。另一个优点是,只要有必要,您就可以拥有多个。

是否有必要使用onchange="submit()“代码来更改值。

Javascript不会改变值。只要enduser更改了值,Javascript就会提交整个表单,而无需自己按submit按钮。不,这没必要。您也可以直接删除它,并期望enduser自己按submit按钮。Once again,JavaScript不是JSF的一部分。

通过实现ActionListener接口来编写自定义侦听器与仅使用UIComponent标记中的属性(action="methodName")有什么区别。

这个问题已经问过了:difference between action and actionlistener

票数 7
EN

Stack Overflow用户

发布于 2012-06-22 10:35:27

调用操作而不是valueChangeListener的romaintaz解决方案也很好,因为在发生“更改”事件时,该操作是在更新模型(例如允许数据库更新)之后调用的,而valueChangeListener是在此之前调用的.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4801535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档