Подтвердить что ты не робот

Альтернатива ui: фрагменту в 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}"> BUT c: если удалить элементы из дерева JSF и это не то, что вы всегда хотите сделать, особенно если вы используете AJAX.

Итак, у вас есть другие решения?

4b9b3361

Ответ 1

Так как ui:fragment не поддерживает рендеринг большей части IDE (например, Netbeans отмечают его как ошибку, но он работает, потому что в параметрах JSF наследуются)

На самом деле это ошибка в объявлении файла тега JSF 2.0 Facelets (в Мохарре, в файле 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> документация тегов).