JSTL c: выберите c: когда не работает на странице JSF - PullRequest
5 голосов
/ 16 сентября 2011

Рассмотрим следующее jstl выберите:

<c:choose>
    <c:when test="#{AuthMsgBean.rw['2'] ne null}">
        Display Text
    </c:when>

    <c:otherwise>
        <ph:outputText id="pan" value="Component pan could not be created." />
    </c:otherwise>
</c:choose>

AuthMsgBean = Bean

rw = Карта

'2' = Ключ


Вопрос:

Когда я простоотображать значение #{AuthMsgBean.rw['2'] ne null}, оно отображается нормально (true), но как только я пытаюсь разобрать значение на <c:when test=""/>, когда тэг снова действует, как будто тест всегда ложен.

Если я поставлю trueв тесте (test="true") отображается текст дисплея.

Может ли быть, что тег <c:when> вычисляется до выражения #{AuthMsgBean.rw['2'] ne null}?

Если да, есть лиобходной путь?

1 Ответ

11 голосов
/ 16 сентября 2011

JSTL и JSF не работают синхронно, как вы ожидаете от кодирования. Во время сборки представления JSF это JSTL, который сначала работает сверху вниз, чтобы создать представление только с тегами JSF. Во время рендеринга представления JSF это JSF, который снова работает сверху вниз, создавая кучу HTML.

Очевидно, что #{AuthMsgBean} отсутствует в области видимости, когда наступает очередь JSTL. Это может произойти, если теги размещены внутри итеративного компонента JSF, например <h:dataTable>.

В любом случае, вы не хотите использовать JSTL здесь. Воспользуйтесь атрибутом JSF rendered.

<h:panelGroup rendered="#{not empty AuthMsgBean.rw['2']}">
    Display Text
</h:panelGroup>
<h:outputText id="pan" value="Component pan could not be created." rendered="#{empty AuthMsgBean.rw['2']}" />

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

...