2012-05-27 1 views
23

Mi sembra che ui:decorate sia funzionalmente uguale a ui:include eccetto che è possibile anche passare ui:param e ui:define al file incluso.Qual è la vera differenza concettuale tra ui: decor e ui: include?

Sono pazzo?

EDIT: Anche se in realtà si può passare ui:param in un file troppo ui:include, si scopre che sto già facendo. Forse puoi passare anche uno ui:define, controllerò e modificherò qui.

+0

Non sono sicuro di aver compreso il tuo problema concreto. Quindi direi, sì, sei pazzo :) – BalusC

+0

@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

+0

Ah, stai solo chiedendo la differenza concettuale? – BalusC

risposta

41

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?

+3

Non capisco la differenza tra "componenti modello definiti dall'utente" e "modello esistente e predefinito". – EJP

+0

Nell'esempio '/ page.xhtml', lo' 'è dove l'utente finale può definire i componenti del modello variabile. – BalusC

+0

Capisco quella parte, proprio non capisco la distinzione che stai disegnando. – EJP