как получить значение из ‹h:selectOneMenu›?

Я хочу получить значение из . я пробовал этот код, но он не работает:

<h:form>
        <h:outputLabel value="départements : "/>
        <h:selectOneMenu value="#{departementController.selected.id}" onchange="submit()" immediate="true">
            <f:valueChangeListener type="Controller.Listener.DepartementValueListener"/>
            <f:selectItems value="#{departementController.itemsAvailableSelectOne}"/>
        </h:selectOneMenu>

        <h:outputLabel value="nouvelle valeur : "/>

        <h:inputText value="#{departementController.comboBox}" id="dep"/>
    </h:form>

контроллер:

 //departement change listener
private String comboBox;

public String getComboBox() {
    return comboBox;
}

public void setComboBox(String comboBox) {
    this.comboBox = comboBox;
}

public void departementChangeListener(ValueChangeEvent e) {
    // Skip validation of non-immediate components and invocation of the submit() method.
    FacesContext.getCurrentInstance().renderResponse();
    this.comboBox = e.getNewValue().toString();}

sourceId=j_idt7:j_idt9[severity=(ERROR 2), summary=(j_idt7:j_idt9 : ошибка проверки. Неверная оценка.), Detail=(j_idt7:j_idt9 : ошибка проверки. Неверная оценка.)]


person Taieb Baccouch    schedule 14.05.2012    source источник
comment
Какую версию JSF вы используете?   -  person BalusC    schedule 14.05.2012
comment
использую jpa2.0 + jsf2.0 + ejb3.0+primefaces3.2   -  person Taieb Baccouch    schedule 14.05.2012
comment
источник кода страницы: nouvelle valeur: ‹/label›‹input id=j_idt7:dep type=text name=j_idt7:dep value= /›‹input type=hidden name=javax.faces.ViewState id=javax.faces .ViewState value=-7060370113585400772:-6095599445324372450 autocomplete=off /›   -  person Taieb Baccouch    schedule 14.05.2012


Ответы (1)


У тебя ведь 2 проблемы.

Во-первых, ошибка "erreur de validation. La valeur est correcte", которая является французским переводом "Ошибка проверки: значение недействительно", означает, что отправленное значение не t equals() любой из доступных элементов в <f:selectItems>. Ваш код недостаточно полон, чтобы указать основную причину, но я полагаю, что у вас есть List<Department> в <f:selectItems value>, и, следовательно, каждый элемент равен Department, но вы пытаетесь установить его как String значение id вместо Department. Это неправильно. Вам нужно поставить преобразователь между Department и String и использовать вместо него #{departementController.selected}.

Что-то вроде этого:

<h:selectOneMenu value="#{bean.selectedDepartment}">
    <f:selectItems value="#{bean.availableDepartments}" />
</h:selectOneMenu>

с участием

private Department selectedDepartment;
private List<Department> availableDepartments;

И @FacesConverter, который преобразует Department в его уникальное представление String.

Ваша вторая проблема заключается в том, что вы, кажется, слишком много внимания уделяете целевым примерам JSF 1.x, чтобы заполнить другое поле при изменении раскрывающегося списка. Для этого вы используете довольно неуклюжий/хакерский обходной путь JSF 1.x. В JSF 2.x для этого можно просто использовать <f:ajax>.

<h:selectOneMenu value="#{bean.selectedDepartment}">
    <f:selectItems value="#{bean.availableDepartments}" />
    <f:ajax listener="#{bean.changeDepartment}" render="inputId" />
</h:selectOneMenu>
<h:inputText id="inputId" value="#{bean.input}" />

с участием

public void changeDepartment() {
    input = selectedDepartment.getId();
}

Смотрите также:

person BalusC    schedule 14.05.2012
comment
Перемещение прослушивателя внутри поддерживающего компонента существенно упрощает проблему, делая выбранный элемент напрямую доступным в его Department форме. Но что, если вам нужен прослушиватель generic, который мог бы выполнять работу за вас в любом selectOneMenu (независимо от конкретных поддерживающих компонентов)? - person YoYo; 20.04.2019