# StackOverflow bei JSF 2.0 Templating



## edfred (2. Jun 2012)

Hallo zusammen,

ich habe mich einmal an JSF 2.0 herangewagt, weil ich das Templating versuchen möchte...
Das hat leider nicht ganz so gut geklappt und ich weiß nicht genau woran es liegt. Meiner Meinung nach kann das nur an der Konfiguration liegen. Leider weiß ich nicht was ich da falsch konfiguriert habe.
Mein Beispiel funktioniert ohne Templating ganz gut. Wenn ich das ganze mit Temples starten möchte dann knallt es.

Das ist meine web.xml:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		 xmlns="http://java.sun.com/xml/ns/javaee" 
		 xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
		 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
		 id="WebApp_ID" 
		 version="3.0">

  <display-name>Zeitfenster</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <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>*.jsf</url-pattern>
  </servlet-mapping>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.PRETTY_HTML</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name>
    <param-value>false</param-value>
  </context-param>
  <context-param>
    <param-name>org.apache.myfaces.AUTO_SCROLL</param-name>
    <param-value>true</param-value>
  </context-param>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>
</web-app>
[/XML]

Das ist meine faces-config.xml
[XML]
<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

	<managed-bean id="loginBean">
		<description>Bean hinter dem Login Formular (login.xhtml)</description>
		<display-name>LoginBean</display-name>
		<managed-bean-name>loginBean</managed-bean-name>
		<managed-bean-class>de.als.zeitfenster.application.login.LoginBean</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
	</managed-bean>

	<navigation-rule>
		<display-name>login.xhtml</display-name>
		<from-view-id>/login.xhtml</from-view-id>
		<navigation-case>
			<from-outcome>login</from-outcome>
			<to-view-id>/welcome.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>


</faces-config>
[/XML]


Meine index.html

```
<html>
<head>
    <meta http-equiv="refresh" content="0; URL=login.jsf">
</head>
</html>
```

Meine login.xhtml

```
<!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:f="http://java.sun.com/jsf/core">
<head>
	<title>Login</title>
</head>
<body>
<ui:composition template="/startTemplate.xhtml">
    <ui:define name="content">
		   <h:form>
		       <h:panelGrid columns="2">
		           <h:outputText value="Name"/>
		           <h:inputText value="#{loginBean.login}"/>
		           <h:outputText value="Password"/>
		           <h:inputSecret value="#{loginBean.password}"/>
		       </h:panelGrid>
		       <h:commandButton value="Login" action="login"/>
		   </h:form>
    </ui:define>
</ui:composition>
</body>
</html>
```

Mein Template startTemplate.xhtml

```
<!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">
<head>
   <title><ui:insert name="title">Zeitfenster</ui:insert></title>
</head>
<body>

<div id="header">
     <ui:insert name="header">
        <ui:include src="/header.xhtml"/>
    </ui:insert>
</div>


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

<div id="footer">
  <ui:insert name="footer">
        <ui:include src="/footer.xhtml"/>
    </ui:insert>
</div>
</body>
</html>
```

Meine header.xhtml

```
<!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:f="http://java.sun.com/jsf/core">

<ui:composition template="/startTemplate.xhtml">
  <h:outputLabel value="Hier kommen Daten für die Titelleiste (header)"/>
</ui:composition>
</html>
```

Meine footer.xhtml

```
<!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:f="http://java.sun.com/jsf/core">

<ui:composition template="/startTemplate.xhtml">
  <h:outputLabel value="Hier kommen Daten für die Fußzeile (footer)"/>
</ui:composition>
</html>
```


Das ist die Exception:

```
javax.faces.FacesException: java.lang.StackOverflowError
	at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241)
	at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156)
	at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:258)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.StackOverflowError
	at javax.faces.component.UIComponent.initialStateMarked(UIComponent.java:175)
	at javax.faces.component.UIComponentBase.initialStateMarked(UIComponentBase.java:949)
	at javax.faces.component._DeltaStateHelper.isInitialStateMarked(_DeltaStateHelper.java:203)
	at javax.faces.component._DeltaStateHelper._createDeltas(_DeltaStateHelper.java:189)
	at javax.faces.component._DeltaStateHelper.put(_DeltaStateHelper.java:308)
	at javax.faces.component._ComponentAttributesMap.put(_ComponentAttributesMap.java:330)
	at javax.faces.component._ComponentAttributesMap.put(_ComponentAttributesMap.java:57)
	at org.apache.myfaces.view.facelets.compiler.UIInstructionHandler.apply(UIInstructionHandler.java:186)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
	at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:322)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:369)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:347)
	at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
	at org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:140)
	at org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
	at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:322)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:369)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:347)
	at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
	at org.apache.myfaces.view.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:128)
	at org.apache.myfaces.view.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:101)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
	at org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:57)
	at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:51)
	at org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:45)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:322)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:369)
	at org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:347)
	at org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:215)
```

Das ganze Wiederholt sich dann nur noch endlos....

Die Java Bean ist trivial... Einfach nur zwei Membervariablen und die Getter/Setter dazu.
Ich benutze Java 7, Tomcat 7.0.27 und Mac OSX. 

Jede Hilfe ist Willkommen und ich danke auch jetzt schon für jeden guten Hinweis der zu einem erfolgreichen Deployment und Ausführung der Webapplikation führt.

Viele Grüße!


----------



## gman (2. Jun 2012)

Hi,

muss man nicht auch die html/head/body-Tags in der JSF-Notation angeben?
Also: [c]<h:head>[/c] (oder so ähnlich, meine JSF-Versuche sind schon länger her.


----------



## JimPanse (2. Jun 2012)

Hi,

du hast eine endlosschleife erstellt, in jedem deiner includes (header & footer) - verweißt du wieder auf dein "startTemplate.xhtml" d.h. wenn deine footer.xhtml eingebunden wird -> wird wieder das template aufgerufen und dann geht das ganze wieder von vorne los.

Entferne in footer.xhtml und header.xhtml die composition und dann sollte es funktionieren.

Und anstatt <head> -> <h:head>

Grüße


----------



## edfred (3. Jun 2012)

Danke, das hat mir weitergeholfen. Allerdings funktioniert das Ganze auch ohne <h:head>.
Gibt es da irgendeinen Grund weswegen man <h:head> anstatt das normale <head> nehmen sollte?

Nochmals vielen Dank euch zweien. 


Viele Grüße

edfred


----------



## Fant (3. Jun 2012)

<h:head> ist eine JSF-Komponente und damit wird der header dem JSF-Komponentenbaum hinzugefügt. Somit kann er manipuliert werden - zB können verwendete Komponentenframeworks selbsständig JavaScipt in den Header schreiben.


----------



## edfred (3. Jun 2012)

Vielen lieben Dank. Dieses Forum und die Mitglieder sind einfach göttlich!

Schönen Sonntag noch und bis zum nächsten Problem! 

Edfred


----------

