2010-11-05 11 views
11

Ho problemi che includono un modello di facelet. Volevo suddividere il contenuto, in modo da poterlo riutilizzare da qualche altra parte.Problema che utilizza l'inclusione in Facelets

Così ho cambiato questo codice:

<!DOCTYPE html> 
<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" 
    template="/layout/template.xhtml"> 

    <ui:define name="head"> 
     <title>Title</title> 
    </ui:define> 

    <ui:define name="header"> 
     <h3>Header</h3> 
    </ui:define> 

    <ui:define name="content"> 
     <table><tr><td>table</td></tr></table> 
    </ui:define> 
</ui:composition> 

A tal:

<!DOCTYPE html> 
<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" 
    template="/layout/template.xhtml"> 

    <ui:define name="head"> 
     <title>Title</title> 
    </ui:define> 

    <ui:include src="/admin/admin_generic.xhtml"/> 
</ui:composition> 

E dentro admin-generic.xhtml ho avvolto il codice in un ui: composition.

<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"> 

    <ui:define name="header"> 
     <h3>Header</h3> 
    </ui:define> 

    <ui:define name="content"> 
     <table><tr><td>table</td></tr></table> 
    </ui:define> 
</ui:composition> 

Ma non viene mostrato nulla. Ho solo una pagina vuota, senza errori. È sbagliato utilizzare ui:composition? Ho provato con ui:component ma non è stato d'aiuto.


Aggiornamento: Secondo il mio Facelets Guida Essentials, che dice:

Il tag ui:include può essere utilizzato per includere un file di Facelets nel documento . Include semplicemente qualsiasi file sorgente specificato. È possibile includere qualsiasi tipo di file Facelets che ha ui:component o ui:composition tag (che tagliare il contenuto di fuori di se stessi) o semplicemente un frammento di XHTML o XML.

E 'quello che sta succedendo? Il contenuto al di fuori del contenuto è ritagliato? Come posso semplicemente includere la pagina, senza che il contenuto esterno venga ritagliato?

risposta

11

Il <ui:define> deve essere inserito in un <ui:composition> o <ui:decorate>con a template contenente l'appropriatoTag. Lo hai spostato su un <ui:composition>senza a template. Nessun modello significa nessun contenuto.

Tecnicamente, per soddisfare le vostre esigenze, è necessario sostituire il <ui:include> entro il <ui:insert>.

<!DOCTYPE html> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    template="template.xhtml"> 

    <ui:define name="head"> 
     <title>Title</title> 
    </ui:define> 

    <ui:insert /> 
</ui:composition> 

e dichiarare la pagina di cui sopra (suppongo che come somepage.xhtml) come template in admin_generic.xhtml.

<!DOCTYPE html> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    template="somepage.xhtml"> 

    <ui:define name="header"> 
     <h1>Header</h1> 
    </ui:define> 

    <ui:define name="content"> 
     <table><tr><td>table</td></tr></table> 
    </ui:define> 
</ui:composition> 

Nota che è necessario aprire admin_generic.xhtml nel browser. Se il tuo intento è di aprire somepage.xhtml nel browser, allora lo <ui:define> deve rimanere in somepage.xhtml.È tuttavia possibile sostituire il corpo di <ui:define> con un semplice <ui:include>.

<!DOCTYPE html> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    template="template.xhtml"> 

    <ui:define name="head"> 
     <title>Title</title> 
    </ui:define> 

    <ui:define name="header"> 
     <h1>Header</h1> 
    </ui:define> 

    <ui:define name="content"> 
     <ui:include src="admin_generic.xhtml" /> 
    </ui:define> 
</ui:composition> 

permette per <ui:composition>, in modo che non hanno necessariamente bisogno di mettere il <table> alla radice.

<!DOCTYPE html> 
<ui:composition 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 

    <table><tr><td>table</td></tr></table> 
</ui:composition> 
+0

Grazie per il chiarimento –

+0

Prego. In futuro cerca di minimizzare il rumore irrilevante nella domanda in modo che altri possano risponderti prima :) – BalusC

+0

Sì, buon consiglio. Andrà bene –

1

Ho risolto questo rimuovendo il <ui:composition> e la <ui:define> e semplicemente aggiungendo lo spazio dei nomi direttamente nella <table> come questo:

<table class="adminform" xmlns="http://www.w3.org/1999/xhtml" 
xmlns:s="http://jboss.com/products/seam/taglib" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:a="http://richfaces.org/a4j"> 

Così ora la mia pagina si presenta così:

<ui:define name="content"> 
    <ui:include src="/admin/admin_generic.xhtml" /> 
</ui:define> 
+2

Non è necessario dichiarare la tabella come root. Un 'ui: composizione' funzionerebbe altrettanto bene. Penso che la tua idea sbagliata sia causata da un sacco di tentativi. Il punto è che 'ui: define' deve andare in un' ui: composition' con un 'template'. – BalusC

+0

Sì hai ragione. Il tuo ultimo punto è la chiave –

Problemi correlati