Valuechangelistener Doubt в JSF

ПРИВЕТ,

Пожалуйста, смотрите следующий код:

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

Бэк

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="submit() этот код для изменения значений.
  • В чем разница между написанием пользовательских слушателей путем реализации интерфейса 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 (напр. с 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 интерфейс. Таким образом, второй может быть более общим, чем первый...

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

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

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

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

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

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

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

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

Другие вопросы по тегам