Альтернатива пользовательскому интерфейсу: фрагмент в 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> тег документации делает).

Другие вопросы по тегам