JSF ui:insert, ui:composite und ui:define; JSF 2.1

allapow

Mitglied
hallo,

ich mache mich seit ein paar Tagen an JSF ran... scheint eigentlich nicht besonders kompliziert!

Nun wollte ich ein Template bauen (index.xhtml):
Java:
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:view>
        <h:body>
                <ui:insert name="login">mist</ui:insert>
        </h:body>
    </f:view>
</html>

und den Template-Client:
Java:
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <body>
        <ui:composition template="index.xhtml">
            <ui:define name="login">
                <h3>login</h3>
                <h:outputText value="etwas Text" />
            </ui:define>
        </ui:composition>
    </body>
</html>

dort anzeigen lassen.
Leider wird immer nur "mist" angezeigt.

Ich bin nun die Grundlagen mit zwei Büchern durchgegangen und habe fest gestellt, dass ich doch eigentlich nichts falsch mache.

Was ich sonst so mit JSF in diesem Projekt mache funktioniert tadellos. Kann mir irgendjemand einen Hinweis geben was ich übersehe oder woran ich noch zu denken habe?!
 

krazun

Bekanntes Mitglied
Der Name des Templates ist für mich ein wenig irreführend. index.xhtml impliziert für mich das du es aufrufst. Aber ich geh mal davon aus das du im Browser die "Template-Client"-Datei aufrufst. Unter welchem Pfad ist das Template denn gespeichert? Versuch mal den kompletten Pfad anzugeben und nicht nur den Dateinamen.

So wie z.B.:

Java:
<ui:composition template="/META-INF/templates/mainTemplate.xhtml">
        <ui:define name="content">

        </ui:define>
</ui:composition>
 

allapow

Mitglied
erstmal danke für das Interesse.

das Template (index.xhtml) liegt direkt im Projekt-Root. Mit "/index.xhtml" habe ich es auch schon ohne Erfolg versucht.

Der TemplateClient liegt in /WEB-INF/zeug/, aber das ist doch egal!?
 

krazun

Bekanntes Mitglied
Also das Template (Deine index.xhtml) ist wie der Name schon sagt nur eine Template. Normalerweise legt man diese Dateien irgendwo ins /META-INF Verzeichnis der Webanwendung. Grund: Auf das /META-INF Verzeichnis hat der Benutzer per Browser keinen Zugriff. Diese Template Dateien werden nie direkt im Browser aufgerufen da sie ja nur Vorlagen sind, die von den eigentlichen Seiten benutzt und Teile überschrieben werden.

Dein Template-Client ist die Datei die der Benutzer per Browser aufruft. Die sollte schon eher index.xhtml heißen.

Wenn du also das Template aufrufst und im Template steht :

Java:
ui:insert name="login">mist</ui:insert>

ist es absolut richtig das du im Browser nur "mist" siehst.

grüße,
krazun
 

allapow

Mitglied
ok, es scheint als habe ich nur gedacht es verstanden zu haben.

Also holen die Template-Clients sich das Template und fügen sich dort selber ein!?

Template "/META-INF/templates/template.xhtml":
Java:
<body>
	<div id="container">
		<div id="header">
			<ui:insert name="header">Default header</ui:insert>
		</div>
		
		<div id="left_sidebar">
			<ui:insert name="left_sidebar">Default left side bar</ui:insert>
		</div>
		
		<div id="content">
			<ui:insert name="content">Default content</ui:insert>
		</div>

		<div id="footer">
			<ui:insert name="footer">Default footer</ui:insert>
		</div>
	</div>
</body>

wird vom zweiten Template "/META-INF/templates/customerTemplate.xhtml":
Java:
<body>
	<ui:composition template="template.xhtml">

		<ui:define name="header">
			<h:graphicImage value="/images/logo.png"/>
			<h1>#{msgs.title_main}</h1>
		</ui:define>

		<ui:define name="left_sidebar">
			<ui:include src="leftSideBar.xhtml"/>
		</ui:define>
		
		<ui:define name="footer">
			<h:outputText value="#{msgs.footer_left_text}" style="float: left;"/>
			<h:outputText value="#{msgs.footer_right_text}" style="float: right"/>
		</ui:define>
		
	</ui:composition>
</body>
geholt/benutzt und "header", "left_sidebar" und "footer" überschrieben...
das Ganze wird dann von der Seite benutzt, die im Browser aufgerufen wird:
Java:
<body>

	<ui:composition template="/META-INF/templates/customerTemplate.xhtml">

		<ui:param name="title" value="#{msgs.title_main} - #{msgs.title_show_customer}"/>

		<ui:define name="content">

		</ui:define>

	</ui:composition>

</body>
...und auch "content" überschrieben.

Das werde ich dann mal gleich in meinem Projekt so umbauen.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Ähnliche Java Themen


Oben