2010-11-05 4 views
11

Ich habe Probleme einschließlich einer Facelet-Vorlage. Ich wollte einige Inhalte aufteilen, damit ich sie woanders wiederverwenden kann.Problem bei der Verwendung in Facelets

Also änderte ich diesen 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> 

Um dies:

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

Und innerhalb admin-generic.xhtml ich den Code in einer ui eingewickelt: Zusammensetzung.

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

Aber nichts wird angezeigt. Ich bekomme nur eine leere Seite, ohne Fehler. Ist es falsch, ui:composition zu verwenden? Ich habe es mit ui:component versucht, aber das hat auch nicht geholfen.


aktualisieren: Nach meinem Facelets Essentials-Guide, heißt es:

Der ui:include-Tag verwendet werden kann, um weitere Facelets in Ihre Dokument-Datei enthalten. Es enthält einfach die von Ihnen angegebene Quelldatei. Sie können schließen jede Facelets-Datei, die ui:component oder ui:composition Tags (die den Inhalt außerhalb ihrer selbst trimmen) oder einfach ein Fragment von XHTML oder XML hat.

Geht das? Ist der Inhalt außerhalb des Include entfernt? Wie kann ich die Seite einfach einfügen, ohne dass der Inhalt außerhalb getrimmt wird?

Antwort

11

The <ui:define> muss in eine <ui:composition> oder <ui:decorate>mit eine template mit der entsprechendenplatziert werdenTags. Sie haben es in einen <ui:composition>ohne a template verschoben. Keine Vorlage bedeutet keinen Inhalt.

Technisch, um Ihre Anforderung zu erfüllen, müssen Sie die <ui:include> durch <ui:insert> ersetzen.

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

und erklärt die oben genannte Seite (ich nehme es als somepage.xhtml) als 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> 

Beachten Sie, dass Sie stattdessen admin_generic.xhtml im Browser zu öffnen. Wenn Ihre Absicht ist, somepage.xhtml im Browser zu öffnen, dann muss die wirklich in somepage.xhtml bleiben.Sie können jedoch den Körper von durch eine einfache <ui:include> ersetzen.

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

Es ermöglicht <ui:composition>, so dass Sie brauchen nicht unbedingt die <table> zu root setzen.

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

Danke für die Klarstellung –

+0

Gern geschehen. In der Zukunft versuchen, irrelevante Geräusche in der Frage zu minimieren, so dass andere es früher beantworten werden :) – BalusC

+0

Ja, guter Tipp. Wird besorgt –

1

Ich löste dies durch die <ui:composition> und die <ui:define> Entfernen und Hinzufügen von nur den Namensraum direkt im <table> wie folgt aus:

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

So, jetzt sieht meine Seite wie folgt aus:

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

Sie müssen die Tabelle nicht unbedingt als root deklarieren. Ein 'ui: composition' würde genauso gut funktionieren. Ich denke, dass dein Missverständnis durch viel Trial'n'Fror verursacht wird. Der springende Punkt ist, dass die 'ui: define' in eine' ui: composition' mit einer 'template' gehen muss. – BalusC

+0

Ja, Sie haben Recht. Ihr letzter Punkt ist der Schlüssel –