JSF Templating funktioniert nicht

BLR

Erfahrenes Mitglied
Hallo zusammen,

bei mir funktioniert eine einfache Sache nicht und zwar das <ui:insert> vom Template bzw. vom Template-Client das <ui:define>

Template, heisst (master.xhtml)

Code:
<h:body>
	<div id="head">
		<ui:include src="./top.xhtml" />
	</div>
	<div id="middle">
		<div id="left">
			<ui:insert name="left">
				<ui:include src="./menuMilch.xhtml" />
			</ui:insert>
		</div>
//************Hier definiere ich einen Bereich, der vom Template-Client gefüllt werden soll**************//
		<div id="articleContent">
			<ui:insert name="content">

			</ui:insert>
		</div>
//***************************************************************************************//
		<div id="right">
			<h1>RechtesDiv</h1>
		</div>

	</div>
	<div id="footer">
		<h1>UnteresDiv</h1>
	</div>
</h:body>

Alle anderen Seiten werden im Template eingebunden.

Templateclient: der sich im selben "webapp" Ordner befindet wie "master.xhtml"

Code:
<h:body>
	<ui:composition template="master.xhtml"/>
		<ui:define name="content">
			<h1>An dem Tag "Inhalt "content" vom tag "define" sollte eignetlich kannt werden, dass hier dieser
                                h1 inhalt hineingebracht werden sollte, allerdings bei passiert nix</h1>
		</ui:define>

</h:body>

Ich bitte um Hilfe
 

Writtscher

Mitglied
Sind das die vollständigen Pages? Wo sind denn die Namespaces? Auf der zweiten Seite kannst du dir das h:body tag sparen. Aber wie gesagt am besten mal beide Pages komplett posten

Edit: Außerdem muss das so aussehen:

Code:
   <ui:composition template="master.xhtml">
        <ui:define name="content">
            <h1>An dem Tag "Inhalt "content" vom tag "define" sollte eignetlich kannt werden, dass hier dieser
                                h1 inhalt hineingebracht werden sollte, allerdings bei passiert nix</h1>
        </ui:define>
   </ui:composition>
 

BLR

Erfahrenes Mitglied
hi )

hier sind beide vollständige Seiten;

TEMPLATE:
Code:
<?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:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<h:outputStylesheet library="css" name="default.css" />
	<h:outputStylesheet library="css" name="layout.css" />
	
	<title>MyJsf</title>
</h:head>

<h:body>
	<div id="head">
		<ui:include src="/top.xhtml" />
	</div>
	<div id="middle">
		<div id="left">
			<ui:insert name="left">
				<ui:include src="#{navigation.milchFleisch}" />
			</ui:insert>
		</div>

		<div id="articleContent">
			<ui:insert name="content"> 
				
			</ui:insert>
		</div>

		<div id="right">
			<h1>RechtesDiv</h1>
		</div>

	</div>
	<div id="footer">
		<h1>UnteresDiv</h1>
	</div>
</h:body>

</html>




TEMPLATE - Client

Code:
<?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:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>myJsf</title>
</h:head>


<h:body>
	<ui:composition template="/master.xhtml">
		<ui:define name="content">
			<h1>Das ist ein test</h1>
		</ui:define>
	</ui:composition>
</h:body>

</html>

In der Zeile 28-30 lasse ich beim Templalte den Bereich vom Template-Client füllen.
Beim Template-Client lasse ich in der Zeilen 16-18 diesen Bereich ansprechen.

Was könnte heir verkehrt sein? danke
 
Zuletzt bearbeitet:

Writtscher

Mitglied
Dein partial reicht so:

Code:
<ui:composition template="/master.xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
        <ui:define name="content">
            <h1>Das ist ein test</h1>
        </ui:define>
</ui:composition>

Funktioniert nur das insert nicht oder wird JSF nicht aufgelöst? Unter welcher URL wird denn dein Facelet angesprochen?

Edit: Das insert tag kann auch geschlossen bleiben. Wird eh aufelöst

Code:
<div id="articleContent">
            <ui:insert name="content" />
        </div>
 

BLR

Erfahrenes Mitglied
also hab jetzt den template-client so angepasst:

Code:
<?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:h="http://java.sun.com/jsf/html"
	xmlns:p="http://primefaces.org/ui">

	<ui:composition template="/master.xhtml">
		<ui:define name="content">
			<h1>Das ist ein test</h1>
		</ui:define>
	</ui:composition>


</html>

Leider bringt das nichts.

Funktioniert nur das insert nicht oder wird JSF nicht aufgelöst?

Effekt ist: Div vom Template ist einfach leer, wobei ich da den Inhalt vom h-tag erwarten würde.

Ich glaube, dass das Insert nicht funktioniert, weil einfach alles leer bleibt, wenn jsf nicht interpritiert worden wäre, dann hätte man wenigstens was im Seitenquelltext gesehen, aber zwischen den "div"-tag ist nix.

Unter welcher URL wird denn dein Facelet angesprochen?
Welches Facelet meinst du genau? Den beim Start:

localhost:8080/Projekt/

dann holt er sich aus dem Welcomfile as template.xhtml

Oder meinst du die url vom template-client?
Die müsste dann ja so aussehen;
localhost:8080/Projekt/templateclient.xhtml

edit:

Ich kriege es mittlerweile hin, dass die Template-Client Seite geladen wird, allerdings
gebe ich explizit beim Template im ui:include den ui:insert-tag für diese Template-Client Seite an. Also das selbe wie bei anderen Template-client Seiten.

Effekt dabei ist, dass ALL Template-Client-Seiten doppelt geladen werden.
D.h
1.Ein mal normal: oben, link, mitte, unten
2.In der mitte(oben,links,unten)

sehr komisch....
 
Zuletzt bearbeitet:

Writtscher

Mitglied
Hi ich meine in der web.xml

Code:
        <servlet>
                <servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
 
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>

Aus dem client partial kann auch das doctype raus ist auch überflüssig da dieses partial eh nur in eine parent Seite integriert wird und diese schon den doctype definiert. Außerdem ist: <!DOCTYPE html> viel schmaler.

Check das mal:
http://www.mkyong.com/jsf2/jsf-2-templating-with-facelets-example/

Edit: Das html tag kann auch weg. Die namespaces können auch im composition tag stehen.
 
Zuletzt bearbeitet:

BLR

Erfahrenes Mitglied
Die web.xml ist bei mir auch so.
Template-client hab ich angepasst, wie du es gesagt hast, allerdings bringt das nicht viel.

In seinem tutorial schreibt er beim Template ja in seinen "insert" den "include"-tag rein.

Code:
<div id="content">
	  	<ui:insert name="content" >
	 	  <ui:include src="/template/common/commonContent.xhtml" />
	   	</ui:insert>
	    </div>

Im Template-client schreibt er:
Code:
<ui:composition template="/template/common/commonLayout.xhtml">
 
    		<ui:define name="content">
    			<h2>This is page1 content</h2>
    		</ui:define>

Allerdings heisst es immer, dass der Content-Bereich sich jede Zeit ändern kann und damit nicht nur
die "commonContent.xhtml" dieses div für sich beanspruchen kann, sondern beliebige xhtml-Seite,
schreibt man lieber:

Code:
<div id="content">
	  	<ui:insert name="content" />
	 	
	    </div>

Aber das will einfach nicht funktionieren....

Ich habe jetzt alles nur auf diese Funktionalität reduziert:
Code:
<?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:h="http://java.sun.com/jsf/html">

<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Store</title>
</h:head>

<h:body>

	<div id="content" class="left_content">
		<ui:insert name="content" />
	</div>

</h:body>

</html>

Template_Client:

Code:
<ui:composition template="/master.xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
        <ui:define name="content">
            <h1>Das ist ein test</h1>
        </ui:define>
</ui:composition>

Allerdings wird "Das ist ein test" nicht angezeigt.

Der Seitenquelltext sieht so aus, wenn ich es starte:
Code:
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"><head><link type="text/css" rel="stylesheet" href="/JesStore/javax.faces.resource/theme.css.xhtml?ln=primefaces-redmond" />
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Store</title></head><body>

	<div id="content" class="left_content">
	</div></body>

</html>

Was mich stützig macht ist, dass ein Teil des Seitenquelltextes rot markiert wird

<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml">


Diese ui:insert-->ui:define Sache funktioniert einfach nicht :(
 
Zuletzt bearbeitet: