2012-02-08 3 views
4

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

+1

Связанный: http://stackoverflow.com/questions/4870462/conditionally-displaying-html-elements/4870557#4870557 – BalusC

+0

@BalusC: могли бы вы уточнить, если это лучше использовать 'rendered' атрибут, чем при использовании 'c: if'? –

+0

Я думаю, что, поскольку у меня будет несколько атрибутов «rendered» для нескольких компонентов, мне может быть лучше, если вы используете набор 'if''' 'иначе, чтобы, если мое первое условие имеет большую вероятность быть правдой, чем я буду сохраненный с дальнейших проверок условий –

ответ

5

Канонический подход 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 in JSF2 Facelets... makes sense?

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

Если переменные, необходимые для оценки состояния, имеют более широкий охват, например. общесистемной или прикладной или жестко закодированы в некоторых клиентах шаблонов, тогда теги JSTL более эффективны, так как они будут оцениваться только во время времени просмотра, а не каждый раз во время просмотра рендеринга. Смотрите также How to make a grid of JSF composite component?

1

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

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

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

+0

, можете ли вы уточнить, лучше ли это использовать 'c: if' & how? –

+0

@user Не знаю. Вам не нужно импортировать пространство имен jstl :) –

+0

Обе книги JavaServer Faces от Hans Bergsten и Core JavaServer Faces отмечают, что использование c: if неэффективно, но не так? В любом случае, зачем использовать их, если вы можете добиться того же со стандартными тегами JSF. – Ravi

Смежные вопросы