Входное значение не обрабатывается в bean-объекте в области запроса при использовании условного рендеринга - PullRequest
2 голосов
/ 14 декабря 2011

Я знаю, что этот тип вопросов задавался здесь миллион раз, но я не смог найти решение своей проблемы в соответствующих сообщениях.

JSF 1.2

У меня есть запрос-bean-объект с методом, используемым в качестве valueChangeListener:

class DoStuff{
    ...
    public void step1ChkStuffIncluded_CheckedChanged(ValueChangeEvent event){
        StuffDocument cd = (StuffDocument)getInfo("StuffDocument");
        if(cd == null){
            Logger.Error("DoStuff", "step1ChkStuffIncluded_CheckedChanged", "No stuff document (null)");
            return;
        }

        if (step1ChkStuffIncludedChecked){
            cd.handleChecked();
        }
        else{
            cd.handleUnchecked();
        }
    }
    ...
}

компонентом selectBooleanCheckbox следующим образом (.jspx):

    ...
    </h:panelGroup> 
    <h:panelGroup rendered="#{DoStuff.pnlStep1}">
        <p>
        <label for="step1ChkStuffIncluded">#{DoStuff.step1ChkStuffIncludedText}</label>

        <h:selectBooleanCheckbox
            id="step1ChkStuffIncluded"
            onchange="submit();"
            value="#{DoStuff.step1ChkStuffIncludedChecked}"
            valueChangeListener="#{DoStuff.step1ChkStuffIncluded_CheckedChanged}">
        </h:selectBooleanCheckbox></p>
    </h:panelGroup>
    <div id="someDiv">
    ...

, где

xmlns:h="http://java.sun.com/jsf/html"

Всякий раз, когда областью действия компонента является сеанс, выполняются как установщик, так и прослушиватель для флажка, но не в области запроса.К сожалению, я не могу найти никаких подсказок, кроме этого.

Любой совет очень ценится.Запросы на дальнейшие разъяснения приветствуются.

1 Ответ

2 голосов
/ 14 декабря 2011

У вас есть rendered="#{DoStuff.pnlStep1}" на родительском компоненте.Во время обработки отправки формы JSF в рамках защиты от атак определит, отображается ли входной компонент (и все его родительские элементы) в соответствии с условиями на стороне сервера.Если он не отображается, то он просто будет полностью пропущен во время обработки.

То, что он работает в bean-объекте области сеанса, но не удается в bean-объекте области запроса, указывает, что значение, стоящее за rendered="#{DoStuff.pnlStep1}", определяется на основе некоторыхпеременная / условие на основе запроса, которая присутствовала во время запроса на отображение формы, но отсутствует во время запроса на обработку отправки формы.

Чтобы исправить это, необходимо убедиться, что вы сохраняете точно такую ​​же переменную/ условие для значения, стоящего за rendered="#{DoStuff.pnlStep1}" во время запроса обработки формы отправки.Есть несколько способов добиться этого, в зависимости от характера условия и способа отправки формы.Один из способов - передать переменную / условие на основе запроса обратно в качестве параметра запроса с помощью <f:param> или <h:inputHidden>.

Каноническое исправление JSF 2.0 состояло бы в том, чтобы поместить компонент в область представления, которая являетсянедоступно в JSF 1.2, но может быть смоделировано с использованием компонента <t:saveState> Томагавка.

См. также:

...