StackOverflow bei JSF 2.0 Templating

edfred

Mitglied
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:
<html>
<head>
    <meta http-equiv="refresh" content="0; URL=login.jsf">
</head>
</html>

Meine login.xhtml
HTML:
<!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
HTML:
<!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
HTML:
<!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
HTML:
<!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:
Code:
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!
 
G

gman

Gast
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

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

Mitglied
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

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

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

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

Edfred
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N StackOverflow Web Tier 2
M JSF Facelet Templating Web Tier 3

Ähnliche Java Themen

Neue Themen


Oben