Альтернативный вариант переключения для страниц JSF - PullRequest
4 голосов
/ 08 февраля 2012

Кроме c:if или c:choose, существуют ли более эффективные способы реализации условного рендеринга 1 компонента из нескольких компонентов. Что-то вроде переключателя для страниц JSF?

Ответы [ 2 ]

6 голосов
/ 08 февраля 2012

Канонический подход JSF для этого использует атрибут rendered. Вот несколько примеров:

<h:someComponent rendered="#{bean.booleanValue}" />
<h:someComponent rendered="#{bean.intValue gt 10}" />
<h:someComponent rendered="#{bean.objectValue eq null}" />
<h:someComponent rendered="#{bean.stringValue ne 'someValue'}" />
<h:someComponent rendered="#{not empty bean.collectionValue}" />
<h:someComponent rendered="#{not bean.booleanValue and bean.intValue ne 0}" />
<h:someComponent rendered="#{bean.enumValue eq 'ONE' or bean.enumValue eq 'TWO'}" />

Разница с тегами JSTL заключается в том, что атрибут rendered оценивается во время визуализации представления, а теги JSTL выполняются во время сборки представления. См. Также JSTL в JSF2 Facelets ... имеет смысл?

Таким образом, если переменные, необходимые для оценки условия, имеют более узкую область видимости, чем область видимости (т. Е. Область запроса), то вместо этого следует использовать атрибут rendered. Например, при повторной визуализации группы компонентов по запросу Ajax. Хотя JSTL-теги могут * одинаково хорошо работать в этом случае, они могут быть оценены «слишком рано» (т. Е. До того, как будет вызвано действие, которое, в свою очередь, могло бы изменить условия), и они также нарушали бы представление. объем. См. Также @ViewScoped разрывы в обработчиках тегов .

Если переменные, необходимые для оценки условия, имеют более широкий охват, например в сеансе или в приложении или жестко закодированы в некотором шаблонном клиенте, тогда теги JSTL более эффективны, так как они будут оцениваться только во время построения представления, а не каждый раз во время отображения представления. См. Также Как создать сетку из составного компонента JSF?

1 голос
/ 08 февраля 2012

Вы можете использовать атрибут rendered:

<h:commandButton rendered="#{value == 'value1'}"/>
<h:commandButton rendered="#{value == 'value2'}"/>

Это не так ясно, как оператор реального случая, но это обычный JSF.

...