2011-01-26 52 views
7

HI,Valuechangelistener疑问,在JSF

请参见下面的代码:

   <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")); 
    }  
} 

请让我知道如果实现是正确的。它工作正常。 我的问题是:

  • 什么是添加f的优势:selectOneMenu用于标签:在^h内valueChangeListener标签。我使用了正常的属性valueChangeListener =“#{countryBean.changeCountry}”。
  • 是否有必要使用的onchange =“提交()这个代码更改数值。
  • 是什么通过实现ActionListener接口编写自定义的听众,只是使用的UIComponent标签的属性之间的差异(动作=“方法名”)。 请给我解释一下。
+0

我的意见是,当我们提交表单时,单独的侦听器实现是有用的,有多个组件的值会发生变化。我们可以在processValueChange方法中做到这一点。如果我们使用该属性进行附加,那么对于单个组件将非常有用。如果我错了,请帮助我。 – Krishna 2011-01-26 05:43:45

回答

20

ValueChangeListener才会被调用时提交表单,而不是当输入值发生变化。因此,如果你想运行这个监听器当值被修改,您有两种解决方案:

  1. onchange事件被触发时,提交表单(这是您在代码中执行的操作);
  2. 改为使用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>之间的区别在于第一个绑定了Java方法(#{myBean.myMethod}),而第二个绑定了实现ValueChangeListener接口的Java类(type="com.foo.MyListenerClass")。所以第二个可能比第一个更通用...

+0

很好的答案,谢谢。 – 2013-04-21 17:15:38

6

Romaintaz已经指出的最多,我只是想直接在您的具体问题:

什么是加入f的优势:selectOneMenu用于标签:归属内valueChangeListener标签。我使用了正常的属性valueChangeListener =“#{countryBean.changeCountry}”。

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

是否有必要使用的onchange =“提交()此代码更改数值。

的JavaScript不会改变的值。的JavaScript提交整个表单,而不需要在按下提交按钮自己,每当值已被终端用户改变。不,这是没有必要的。你也可以将其删除,并期望最终用户按下提交按钮自己。Once again,JavaScript是不是JSF的一部分。

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

此问题已被问:difference between action and actionlistener

0

调用action而不是valueChangeListener的romaintaz解决方案也很棒,因为在“change”事件的情况下,在调用valueChangeListener时更新模型(例如允许数据库更新)后调用该操作之前....