Альтернатива пользовательскому интерфейсу: фрагмент в JSF - PullRequest
25 голосов
/ 15 сентября 2010

Я ищу поддерживаемый способ рендеринга фрагмента кода в 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 Ответ

55 голосов
/ 15 сентября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...