Ответ 1
Основное различие между <ui:include>
и <ui:decorate>
заключается в том, что <ui:decorate>
предназначен для включения пользовательских компонентов шаблона, а <ui:include>
предназначен для включения существующего и уже предопределенного шаблона.
Это действительно означает, что <ui:decorate>
поддерживает <ui:define>
для пользовательских компонентов шаблона в своем теле и может вставлять его на <ui:insert>
размещать внутри шаблона.
Здесь a - несколько неудобный пример, чтобы показать, где он может быть использован:
/WEB-INF/templates/field.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:outputLabel for="#{id}" value="#{label}" />
<ui:insert name="input" />
<h:message id="#{id}_message" for="#{id}" />
</ui:composition>
/page.xhtml
<h:panelGrid columns="3">
<ui:decorate template="/WEB-INF/templates/field.xhtml">
<ui:param name="label" value="Foo" />
<ui:param name="id" value="foo" />
<ui:define name="input">
<h:inputText id="foo" value="#{bean.foo}" required="true" />
</ui:define>
</ui:decorate>
<ui:decorate template="/WEB-INF/templates/field.xhtml">
<ui:param name="label" value="Bar" />
<ui:param name="id" value="bar" />
<ui:define name="input">
<h:selectBooleanCheckbox id="bar" value="#{bean.bar}" required="true" />
</ui:define>
</ui:decorate>
...
</h:panelGrid>
Обратите внимание, что он прекрасно отображает компоненты в каждой ячейке сетки панели. Опять же, этот конкретный пример довольно неуклюжий, я бы просто использовал файл тега. Только если это был больший участок, например. целую форму, например, его верхний или нижний колонтитул должен быть настраиваемым, тогда было бы подходящим <ui:decorate>
.
Другим важным преимуществом <ui:decorate>
является то, что он позволяет использовать составной компонент с шаблоном. См. Также Можно ли использовать шаблон с составным компонентом в JSF 2?