Какова реальная концептуальная разница между ui: decorate и ui: include?

Похоже, что ui:decorate функционально совпадает с ui:include, за исключением того, что вы также можете передать ui:param и ui:define во включенный файл.

Я сошел с ума?

EDIT: Хотя на самом деле вы можете передать ui:param в файл ui:include, оказывается, я уже это делаю. Возможно, вы также можете передать ui:define, я проверю и отредактирую здесь.

Ответ 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?