2010-08-13 11 views
9

Ciò deve essere semplice. Sto cercando di passare l'elemento secondario in un componente JSF. Ho il mio componente dichiarata come:Includere l'elemento secondario all'interno del componente JSF 2.0

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
</composite:interface> 

<composite:implementation> 
    <div style="border: 1px solid black;"> 
     <ui:insert /> 
    </div> 
</composite:implementation> 

</html> 

allora io uso questo in una pagina: "Ciao mondo"

<box:box> 
    <p>Hello world!</p> 
</box:box> 

Purtroppo, la casella rende ok (il bordo nero), ma la il testo non è incluso al suo interno. Ho anche provato una sintassi più dettagliata usando <ui:insert name="content"> e chiamando da <ui:define name="content">Hello World!</ui:define> ma non ha funzionato.

Dove posso fare un errore?

risposta

12

Ok ho capito. Dovresti utilizzare <composite:insertChildren /> invece che:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

<composite:interface> 
</composite:interface> 

<composite:implementation> 
    <div style="border: 1px solid black;"> 
     <composite:insertChildren /> 
    </div> 
</composite:implementation> 

</html> 

Questo funziona.

0

è necessario inviare il contenuto come parametro:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <html 
     xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute name="content"/> 
    </composite:interface> 

    <composite:implementation> 
     <div style="border: 1px solid black;"> 
      <h:outputText value="#{cc.attrs.content}" escape="false"/> 
     </div> 
    </composite:implementation> 

</html> 

e nel codice:

<box:box content="<p>Hello world!</p>" /> 

ho aggiunto il escape="false" dal momento che si sta utilizzando i tag HTML all'interno della espressione EL.

Leggi tutto su elementi compositi in David Geary’s article

+1

Sì, questo sarebbe un modo per farlo, ma è un design molto brutto. Inoltre, cosa succede se ho una sezione più lunga del codice XHTML/JSF che voglio usare come sottoelemento? Passare il contenuto come attributo di stringa è scomodo. Invece, lo stile che ho provato (usando '') dovrebbe funzionare, come spiegato in http://www.packtpub.com/article/creating-composition-components-in-jsf-2.0 (guarda il capitolo "Passare sotto- elementi per componenti di composizione "). Questo stesso approccio è trattato anche nelle API JSF 2 e JBoss Seam. Tuttavia, nei miei test fallisce. –