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

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

Я сумасшедший?

РЕДАКТИРОВАТЬ: Хотя на самом деле вы можете передать ui:param к ui:include файл тоже, оказывается я уже этим занимаюсь. Может быть, вы можете передать ui:define а также я проверю и отредактирую здесь.

1 ответ

Решение

Основное различие между <ui:include> а также <ui:decorate> это то, что <ui:decorate> предназначен для того, чтобы позволить вставку пользовательских компонентов шаблона, в то время как <ui:include> предназначен для включения существующего и уже предопределенного шаблона.

Это действительно означает, что <ui:decorate> опоры <ui:define> для пользовательских компонентов шаблона в его теле и может вставить его на <ui:insert> разместить внутри шаблона.

Вот несколько неуклюжий пример, чтобы показать, где его можно использовать:

/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?

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