Какова реальная концептуальная разница между 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?