Der Hauptunterschied zwischen <ui:include>
und <ui:decorate>
ist, dass die Einfügung von <ui:decorate>
benutzerdefinierten Schablonenkomponenten vorgesehen ist, damit, während die <ui:include>
vorgesehen ist, eine vorhandene und bereits vordefinierte Vorlage aufzunehmen.
Dies bedeutet in der Tat, dass die <ui:decorate>
unterstützt <ui:define>
für benutzerdefinierte Vorlagenkomponenten in seinem Körper und kann es unter der <ui:insert>
Platz in der Vorlage einfügen.
Hier ist ein -somewhat clumsy- Beispiel zu zeigen, wo es verwendet werden kann:
/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>
Beachten Sie, dass es die Komponenten gut in jeder Zelle macht von das Panel-Raster. Auch dieses spezielle Beispiel ist ziemlich plump, ich hätte stattdessen stattdessen eine tag file verwendet. Nur wenn es ein größerer Abschnitt war, z. ein ganzes Formular, dessen z.B. seine Kopf- oder Fußzeile sollte anpassbar sein, dann wäre eine <ui:decorate>
angemessen gewesen.
Ein weiterer großer Vorteil von <ui:decorate>
ist, dass Sie eine Verbundkomponente mit einer Vorlage verwenden können. Siehe auch Is it possible to use template with composite component in JSF 2?
Ich bin mir nicht sicher, ob ich Ihr konkretes Problem verstehe. Also würde ich sagen, ja du bist verrückt :) – BalusC
@BalusC Ich mag zwar verrückt sein, aber ich sage kein konkretes Problem, nur ein allgemeines Prinzip. Ich habe versucht herauszufinden, was zwischen diesen beiden Konstrukten tatsächlich besteht, und ich kann keine finden. Möglicherweise ui: include unterstützt nicht ui: define, ich hatte andere Probleme beim Testen. – EJP
Ah, Sie fragen nur nach dem konzeptionellen Unterschied? – BalusC