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: valueChangeListener бирка внутри h: selectOneMenu тег. Я использовал обычный атрибут valueChangeListener= " #{countryBean.changeCountry}".
  • нужно использовать onChange, после="отправить() этот код для изменения значений.
  • в чем разница между написанием пользовательских прослушивателей путем реализации интерфейса ActionListener и просто использованием атрибута в тегах UIComponent (action="methodName"). Пожалуйста, объясните мне.

3 ответов


на 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 (ex. с 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}), в то время как второй связывает класс Java (type="com.foo.MyListenerClass"), который реализует ValueChangeListener интерфейс. Так что второй может быть более общим, чем первый...


Romaintaz уже указал на большинство, я просто хотел получить прямо на ваши конкретные вопросы:

в чем преимущество добавления тега f:valueChangeListener внутри тега H:selectOneMenu. Я использовал обычный атрибут valueChangeListener= " #{countryBean.changeCountry}".

Как сказал Роментаз, атрибут указывает на метод и f: тэги к классу. Еще одним преимуществом является то, что вы можете иметь несколько из них, когда это необходимо.

необходимо ли использовать onchange= " submit () этот код для изменения значений.

этот Javascript не изменяет значения. Что Javascript отправляет всю форму без необходимости нажатия кнопки отправки самостоятельно, всякий раз, когда значение было изменено конечным пользователем. Нет, в этом нет необходимости. Вы также можете просто удалить его и ожидать, что пользователь нажимает кнопку себе представить. еще раз, что JavaScript не является частью JSF.

в чем разница между написанием пользовательских прослушивателей путем реализации интерфейса ActionListener и просто использованием атрибута в тегах UIComponent (action="methodName").

этот вопрос уже задавал раньше: разница между действием и actionlistener.


решение от romaintaz вызова действия вместо valueChangeListener также отлично, потому что в случае события "изменение" действие вызывается после обновления модели (например, с учетом обновления БД), в то время как valueChangeListener вызывается раньше....