JSF: Как получить выбранный элемент из selectOneMenu, если его рендеринг динамический?

На мой взгляд, у меня есть два меню, которые я хочу сделать зависимыми, а именно, если первое меню содержит значения «отображать второе меню» и «не отображать второе меню», я хочу, чтобы второе меню отображалось, только если пользователь выбирает «отображать второе меню». меню" в первом меню. После того, как второе меню отобразится на той же странице, что и первое, пользователь должен выбрать из него текущий элемент, заполнить другие поля и отправить форму для сохранения значений в базе данных. Оба списка опций являются статическими, они получаются из базы данных один раз и остаются неизменными. Моя проблема в том, что я всегда получаю значение null в качестве значения выбранного элемента из второго меню. Как получить правильное значение? Пример кода представления, содержащего проблемные элементы:

<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}"
                                 valueChangeListener="#{Bean.updateDependentMenus}"
                                 immediate="true"
                                 onchange="this.form.submit();" >
                    <f:selectItems value="#{Bean.typesOfRendering}" />
                </h:selectOneMenu><br />

<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}"
                                 rendered="#{Bean.rendered}" >
                    <f:selectItems value="#{Bean.items}" />
                </h:selectOneMenu><br />
<h:commandButton action="#{Bean.store}" value="#Store" />

Однако, если я уберу атрибут «рендеринг» из второго меню, все будет работать правильно, за исключением отображения меню на все время, которое я пытаюсь предотвратить, поэтому я предполагаю, что проблема заключается в поведении динамического рендеринга. Начальное значение isRendered равно false, так как пункт по умолчанию в первом меню — «не отображать второе меню». Когда я меняю значение в первом меню и обновляю isRendered с помощью valueChangeListener, отображается второе меню, но оно не инициализирует currentItem при отправке.

Некоторый код из моего резервного компонента приведен ниже:

public void updateDependentMenus(ValueChangeEvent value) {
    String newValue = (String) value.getNewValue();
        if ("render second menu" == newValue){
            isRendered = true;
        } else {
            isRendered = false;
        }
}

public String store(){
    System.out.println(currentItem);
    return "stored";
}

jsf
person Zmicier Zaleznicenka    schedule 19.05.2010    source источник


Ответы (2)


Если вы используете атрибут rendered для компонентов UIInput и UICommand, то вы должны убедиться, что условие rendered оценивается в последующем запросе (во время отправки формы) точно так же, как и во время исходного запроса (во время отображения формы). форма). Когда он оценивает false, значения запроса не будут применяться/проверяться, а значения модели не будут обновляться, и для рассматриваемого компонента (компонентов) не будет выполняться никаких действий.

Простое решение состоит в том, чтобы поместить компонент в область сеанса, но это также имеет оговорки (плохой пользовательский интерфейс при открытии одной и той же страницы в нескольких вкладках/окнах браузера). В JSF 2.0 вместо этого вы можете использовать область представления. В JSF 1.x для этого можно использовать t:saveState Tomahawk.

person BalusC    schedule 19.05.2010
comment
Да, вот я тоже об этом подумал. Однако не знал о области видимости. Спасибо. - person Zmicier Zaleznicenka; 19.05.2010

Проблема возникает только тогда, когда у нас есть «не отображать» в качестве первого варианта. Я решил изменить значения в базе данных, и теперь у меня есть «рендеринг второго меню» в качестве первого. При таком подходе все работает нормально.

person Zmicier Zaleznicenka    schedule 19.05.2010