La differenza principale tra <ui:include>
e <ui:decorate>
è che il <ui:decorate>
è destinato a consentire l'inserimento di componenti modello definito dall'utente, mentre il <ui:include>
intende includere un modello esistente e già predefinita.
Ciò significa che lo <ui:decorate>
supporta <ui:define>
per i componenti del modello definiti dall'utente nel suo corpo e può inserirlo nella posizione <ui:insert>
all'interno del modello.
Ecco un esempio clumsy- -somewhat per mostrare dove può essere utilizzato:
/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>
noti che rende i componenti bene in ogni cella la griglia del pannello. Ancora una volta, questo particolare esempio è piuttosto goffo, avrei invece usato un tag file. Solo se era una sezione più grande, ad es. un intero modulo di cui ad es. la sua intestazione o piè di pagina dovrebbe essere personalizzabile, quindi sarebbe stato appropriato un <ui:decorate>
.
Un altro vantaggio importante di <ui:decorate>
è che consente di utilizzare un componente composito con un modello. Vedi anche Is it possible to use template with composite component in JSF 2?
Non sono sicuro di aver compreso il tuo problema concreto. Quindi direi, sì, sei pazzo :) – BalusC
@BalusC Potrei davvero essere pazzo, ma non sto affermando un problema concreto, solo un principio generale. Ho cercato di capire qual è la differenza effettiva tra questi due costrutti e non riesco a trovarne. Forse ui: include non supporta ui: define, ho avuto altri problemi durante il test. – EJP
Ah, stai solo chiedendo la differenza concettuale? – BalusC