JSF ValueChangeListener не работает - PullRequest
4 голосов
/ 31 октября 2011

Я учусь использовать события с JSF. По какой-то причине программа не меняет значение в текстовом поле, когда я изменяю значение в раскрывающемся меню. Страница загружается и показывает «Германия», но не меняет текстовое поле на «DE». Есть предложения?

index.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>Facelet Title</title>
</h:head>
<h:body>
    <f:view>
        <h:form>
            <h:selectOneMenu value="#{Bean.selectedItem}" valueChangeListener="#{Bean.changeEvent}" onchange="submit()"  >
                <f:selectItems value="#{Bean.itemsList}" />
            </h:selectOneMenu>
            <br />
            <h:inputText value="#{Bean.selectedItem}" />
        </h:form>
    </f:view>
</h:body>

MyBean.java

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import java.util.ArrayList;
import javax.faces.model.SelectItem;
import javax.faces.event.ValueChangeEvent;
@ManagedBean (name = "Bean")
@RequestScoped
public class MyBean {

private static ArrayList menuItems;
private String selectedItem = "EN";
static {
    menuItems = new ArrayList();
    menuItems.add(new SelectItem("EN", "English"));
    menuItems.add(new SelectItem("DE", "Germany"));
}

public ArrayList getItemsList() {
    return this.menuItems;
}

public void setSelectedItem(String item) {
    this.selectedItem = item;
}

public String getSelectedItem() {
    return selectedItem;
}

public void changeEvent(ValueChangeEvent e) {
    selectedItem = e.getNewValue().toString();
}

}

Ответы [ 2 ]

14 голосов
/ 31 октября 2011

Вы в основном злоупотребляете valueChangeListener как actionListener.Предполагается, что слушатель изменения значения имеет доступ к и старому и новому значению, прямо между отправкой нового входного значения и обновлением значения модели, так что вы можете, например, добавитьзапись в журнале об изменении значения.Вы, очевидно, не заинтересованы в старой стоимости.Вы не заинтересованы в событии изменения значения вообще.Вы заинтересованы только в новой стоимости модели.Так что вам вообще не следует использовать прослушиватель изменения значения.

Обычно вы хотите выполнять эту работу в методе прослушивателя действия.Вы можете использовать <f:ajax> для определения слушателя действия ajax:

<h:selectOneMenu value="#{Bean.selectedItem}">
    <f:selectItems value="#{Bean.itemsList}" />
    <f:ajax execute="@this" listener="#{Bean.changeEvent}" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />

с

public void changeEvent() {
    selectedItem = selectedItem;
}

Но поскольку вы связали вход с тем же свойством, что и раскрывающийся список, весьслушатель лишний.Только следующее должно сделать это для вас:

<h:selectOneMenu value="#{Bean.selectedItem}">
    <f:selectItems value="#{Bean.itemsList}" />
    <f:ajax execute="@this" render="input" />
</h:selectOneMenu>
<h:inputText id="input" value="#{Bean.selectedItem}" />

Проблема, с которой вы сталкиваетесь, заключается в том, что onchange="submit()" по существу представляет форму целом , включая все другие поля ввода.Поскольку JSF обрабатывает поля ввода последовательно и вы связываете оба поля с одним и тем же свойством, значение <h:inputText> переопределяет значение <h:selectOneMenu>.Что касается моего комментария к вопросу, у вас не будет этой проблемы, если вы сделаете его <h:inputText readonly="true"> или <h:outputText> (чтобы он не передавал свое значение на сервер).

1 голос
/ 31 октября 2011

Измените его на компонент вывода текста и посмотрите, работает ли он

<h:inputText value="#{Bean.selectedItem}" />

до

<h:outputText value="#{Bean.selectedItem}" />

С уважением!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...