2010-11-05 3 views
11

J'ai des problèmes, y compris un modèle de facelet. Je voulais diviser du contenu, pour pouvoir le réutiliser ailleurs.Problème d'utilisation include dans Facelets

Je changé ce code:

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

à ceci:

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

Et à l'intérieur admin-generic.xhtml J'enveloppa le code dans une interface: 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> 

Mais rien n'est affiché. Je viens d'obtenir une page blanche, sans erreurs. Est-ce mal d'utiliser ui:composition? J'ai essayé avec ui:component mais cela n'a pas aidé non plus.


Mise à jour: Selon mon Facelets Guide Essentials, il est dit:

La balise ui:include peut être utilisé pour inclure un autre fichier Facelets dans votre document . Il inclut simplement le fichier source que vous spécifiez. Vous pouvez inclure un fichier Facelets qui a ui:component ou ui:composition balises (qui le contenu en dehors retaillent eux-mêmes) ou simplement un fragment de XHTML ou XML.

Est-ce que c'est ce qui se passe? Le contenu en dehors de l'inclusion est-il supprimé? Comment puis-je simplement inclure la page, sans que le contenu soit coupé?

Répondre

11

Le <ui:define> doit être placé dans un <ui:composition> ou <ui:decorate>avec un template contenant leappropriéétiquettes. Vous l'avez déplacé à <ui:composition>sans un template. Aucun modèle ne signifie aucun contenu. Techniquement, pour réaliser votre besoin, vous devez remplacer le <ui:include> par <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> 

Et déclarer la page ci-dessus (je suppose que comme somepage.xhtml) comme dans templateadmin_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> 

Notez que vous devez ouvrir admin_generic.xhtml dans le navigateur. Si votre intention est d'ouvrir somepage.xhtml dans le navigateur, alors le <ui:define> doit vraiment rester dans somepage.xhtml.Vous pouvez cependant remplacer le corps de <ui:define> par un simple <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> 

Il permet de <ui:composition>, de sorte que vous ne devez pas nécessairement mettre le <table> à la racine.

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

Merci pour la clarification –

+0

De rien. Dans le futur, essayez de minimiser le bruit non pertinent dans la question afin que les autres y répondent plus tôt :) – BalusC

+0

Oui, bon conseil. Ça ira –

1

Je résolu ce problème en supprimant le <ui:composition> et le <ui:define> et juste ajouter l'espace de noms directement dans le <table> comme ceci:

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

Alors maintenant, ma page ressemble à ceci:

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

Vous n'avez pas nécessairement besoin de déclarer la table en tant que root. Un 'ui: composition' fonctionnerait aussi bien. Je pense que votre idée fausse est causée par beaucoup d'essais et d'erreurs. Tout le problème est que le 'ui: define' doit aller dans un' ui: composition' avec un 'template'. – BalusC

+0

Oui, vous avez raison. Votre dernier point est la clé –