2012-05-27 4 views
23

Es tritt vor mir auf, dass ui:decorate ist funktionell das gleiche wie ui:include mit der Ausnahme, dass Sie auch ui:param und ui:define an die enthaltene Datei übergeben können.Was ist der eigentliche konzeptionelle Unterschied zwischen ui: decorate und ui: include?

Bin ich verrückt?

EDIT: Obwohl in der Tat Sie zu ui:param zu einer ui:include Datei passieren kann, es stellt sich heraus, dass ich es schon tue. Vielleicht können Sie auch eine ui:define übergeben, ich werde hier überprüfen und bearbeiten.

+0

Ich bin mir nicht sicher, ob ich Ihr konkretes Problem verstehe. Also würde ich sagen, ja du bist verrückt :) – BalusC

+0

@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

+0

Ah, Sie fragen nur nach dem konzeptionellen Unterschied? – BalusC

Antwort

41

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?

+3

Ich verstehe den Unterschied zwischen 'benutzerdefinierten Vorlagenkomponenten' und 'vorhandenen und vordefinierten Vorlagen' nicht. – EJP

+0

In dem gegebenen '/ page.xhtml' Beispiel ist der' ', wo der Endbenutzer variable Vorlagenkomponenten definieren kann. – BalusC

+0

Ich verstehe diesen Teil, ich verstehe einfach nicht die Unterscheidung, die Sie zeichnen. – EJP

Verwandte Themen