Альтернатива пользовательскому интерфейсу: фрагмент в JSF
Я ищу поддерживаемый способ визуализации части кода в JSF, я обычно использую этот подход:
<ui:fragment rendered="#{condition}">
<h:outputText value="text 1"/>
<h:outputText value="text 2"/>
<h:outputText value="text 3"/>
</ui:fragment>
Поскольку ui: фрагмент не поддерживает рендеринг большинства IDE (как NetBeans помечает это как ошибку, НО это работает, потому что в JSF параметры наследуются.
Одним из способов решения этой проблемы является использование другой структуры (например, если вы используете SEAM), которую вы можете использовать
<s:div rendered="#{condition}">
....
</s:div>
Другой способ - установить визуализацию во всем внутреннем контенте следующим образом:
<h:outputText value="text 1" rendered="#{condition}"/>
<h:outputText value="text 2" rendered="#{condition}"/>
<h:outputText value="text 3" rendered="#{condition}"/>
Но мне не нравится этот способ, потому что вы должны добавить рендеринг к каждому элементу.
Другой способ будет использовать <c:if test="#{condtion}">
НО c: если удалить элементы из дерева JSF, и это не то, что вы всегда хотите делать, особенно если вы используете AJAX.
Так у вас, ребята, есть другие решения?
1 ответ
поскольку
ui:fragment
не поддерживает рендеринг большинства IDE (как Netbeans помечает это как ошибку, НО это работает, потому что в JSF параметры наследуются)
На самом деле это ошибка в объявлении файла тегов JSF 2.0 Facelets (в Mojarra это com/sun/faces/metadata/taglib/ui.taglib.xml
файл). rendered
атрибут пропускается и отсутствует в объявлении файла тега (а также в JSF 2.0 <ui:fragment>
документация), хотя он действительно присутствует в UIComponent
, Проверка IDE основана на объявлениях файла тегов и, следовательно, дает ошибочную ошибку проверки. Эта проблема исправлена в JSF 2.1, отсутствующий атрибут добавлен в объявление файла тега (а также в JSF 2.1 <ui:fragment>
пометка документации).
Если либо просто игнорировать предупреждения IDE, либо выполнить обновление до JSF 2.1, это не вариант, то вы можете использовать <h:panelGroup>
вместо компонента:
<h:panelGroup rendered="#{condition}">
<h:outputText value="text 1"/>
<h:outputText value="text 2"/>
<h:outputText value="text 3"/>
</h:panelGroup>
В любом случае ничего не выводится, если вы не укажете id
, style
, styleClass
и как атрибуты, а еще простой <span>
будет оказано.
Если все, что у вас есть, это простой ванильный HTML (т.е. без компонентов JSF), то вы также можете рассмотреть возможность использования <f:verbatim>
,
<f:verbatim rendered="#{condition}">
text 1
text 2
text 3
</f:verbatim>
Тем не менее <f:verbatim>
устарела в JSF 2.0 (которая, в свою очередь, также имеет документальную ошибку, JSF 2.0 <f:verbatim>
В документации по тегам не упоминается об устаревании, но в JSF 2.1 <f:verbatim>
тег документации делает).