# Tiles - JSF Problem



## nightpoet (1. Okt 2007)

Hallo zusammen

Seit drei Tagen schlage ich mit mit einem nervigen Tiles Problem herum.

Beim Aufruf einer Seite, welche durch das Tiles Framework aus mehreren JSF-Seiten zusammengesetzt werden soll, erhalte ich eine leere Seite als Response. Dabei werden durch den Server keinerlei Exceptions geworfen.

Hier die Konfiguration:

web-xml:


```
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>PLEBSWebClient</display-name>
 
 <context-param>
  	<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  	<param-value>server</param-value>
 </context-param>
 
 <servlet>
  	<servlet-name>FacesServlet</servlet-name>
  	<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
 	<init-param>
  	 	<param-name>javax.faces.CONFIG_FILES</param-name>
   		<param-value>/WEB-INF/faces-config.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet>
  	<servlet-name>TilesServlet</servlet-name>
  	<servlet-class>org.apache.struts.tiles.TilesServlet</servlet-class>
  	<init-param>
   		<param-name>definitions-config</param-name>
   		<param-value>/WEB-INF/tiles-defs.xml</param-value>
  	</init-param>
  	<init-param>
   		<param-name>definitions-parser-validate</param-name> 
   		<param-value>true</param-value> 
  	</init-param>
  	<load-on-startup>2</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  	<servlet-name>FacesServlet</servlet-name>
  	<url-pattern>*.faces</url-pattern>
 </servlet-mapping>
 
 <welcome-file-list>
  	<welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 
 <error-page>
  	<error-code>404</error-code>
  	<location>/views/404.jsp</location>
 </error-page>
 
 <error-page>
  <error-code>403</error-code>
  <location>/views/403.jsp</location>
 </error-page> 
</web-app>
```

Der Auszug aus der tiles-defs.xml, welcher die entsprechende Definition erzeugt sieht so aus:


```
<definition name="plebs.mainLayout" path="views/tiles/layout.jsp">
		<put name="header" value="views/tiles/header.jsp"/>
		<put name="topmenu" value="views/tiles/empty.jsp"/>	
		<put name="leftmenu" value="views/tiles/leftmenu.jsp"/>	
		<put name="messagefield" value="views/tiles/messagefield.jsp"/>
		<put name="footer" value="views/tiles/footer.jsp"/>
		<put name="body1" value="views/tiles/empty.jsp"/>	
		<put name="body2" value="views/tiles/empty.jsp"/>	
		<put name="contextmenu" value="views/tiles/empty.jsp"/>	
	</definition>	
	
	<definition name="plebs.welcome" extends="plebs.mainLayout">
		<put name="body1" value="views/tiles/welcome.jsp"/>
		<put name="body2" value="views/tiles/gameSelection.jsp"/>			
	</definition>
```


Die Layout Datei bindet die Tiles Inserts über subview oder verbatim Tags in den JSF Komponentenbaum ein:



```
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>   

 
<div class="mainmenucontainer">				
      	<f:subview id="leftmenu">
		<tiles:insert attribute="leftmenu" flush="false"></tiles:insert>
	</f:subview>
</div>
				
<div class="maincontainer">	
			
	<div class="headercontainer">
		<f:subview id="header">						
			<tiles:insert attribute="header" flush="false"></tiles:insert>
		</f:subview>
	</div>
					
	<div class="submenucontainer">
		<f:subview id="topmenu">	
			<tiles:insert attribute="topmenu" flush="false"></tiles:insert>
		</f:subview>
	</div>		
					
	<div class="contentcontainer">
		<f:verbatim>
			<tiles:insert attribute="body1" flush="false"></tiles:insert>
		</f:verbatim>
						
		<f:verbatim>
			<tiles:insert attribute="body2" flush="false"></tiles:insert>
		</f:verbatim>
	</div>
					
	<div class="messagefield">
		<f:verbatim>
			<tiles:insert attribute="messagefield" flush="false"></tiles:insert>
		</f:verbatim>
	</div>
					
	<div class="contextmenucontainer">
		<f:verbatim>
			<tiles:insert attribute="contextmenu" flush="false"></tiles:insert>
		</f:verbatim>
	</div>
					
	<div = class="footercontainer">
		<f:subview id="footer">
			<tiles:insert attribute="footer" flush="false"></tiles:insert>
		</f:subview>
	</div>
</div>
```

Hier ist die aufgerufene Seite, welche lediglich die einleitenden HTML und JSF-Tags enthält und die Tiels Definition in den Body einbindet:


```
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>  

  
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>  
	<f:view>
		<head>	    
	    	<title>PLEBS</title>
	    
	    	<meta http-equiv="expires" content="0">
	    	<meta http-equiv="pragma" content="no-cache">
	    	<meta http-equiv="cache-control" content="no-cache">   
	    	<meta http-equiv="keywords" content="">
	    	<meta http-equiv="description" content="PLEBS - Platform for Educational Business Simulations">
		</head>
	
		<link rel="stylesheet" type="text/css" href="/css/styles.css">
			
		<link rel="javascript" type="text/javascript" href="/script/functions.js">			
		
		<body>
			<f:subview id="pagecontainer">
				<tiles:insert definition="plebs.welcome" flush="false"/>
			</f:subview>				
		</body>
	</f:view>
</html>
```

Der Aufruf erfolgt über den folgenden Redirect aus der Seite index.jsp:


```
<%@ page session="false" language="java" contentType="text/html; charset=ISO-8859-1"%>
	<% response.sendRedirect("views/welcome.faces"); %>
```

Die JSF-Konfiguration läuft für eine Seite, welche lediglich JSF-Tags verwendet einwandfrei. Umgekehrt habe ich die Tiles-Konfiguration getestet, indem ich eine Testdefinition verwendet habe, welche ausser der leeren JSP-Seite nur eine einfache Textseite ohne JSF verwendet. Auch hier wird nur der umgebende HTML-Code ausgegeben, der Insert an sich jedoch nicht mehr ausgeführt. Das Problem scheint demnach hauptsächlich mit der Tiles-Konfiguration zusammenzuhängen.

Hat vielleicht jemand eine Idee, woran das liegen könnte oder ähnliche Erfahrungen?


----------



## kleiner_held (2. Okt 2007)

Tiles und JSF zu kombinieren ist leider keine triviale Sache, ich habe damit auch einen ganze Weile gekaempft, bis ich eine akzeptable Loesung hatte.
Ich verwende Apache MyFaces in Verbindung mit Tiles, eine Anleitung dazu gibt es unter
wiki.apache.org/myfaces/Tiles_and_JSF

Ansosten enthaelt meine Layout Datei die globale jsf view mit tiles insert Anweisungen

```
<f:view>  
...
<tiles:insert attribute="menu" flush="false"/>
...
</f:view>
```
und die einzufuegenden JSP Dateien definieren jeweils eine subview oder enthalten gar keine JSF spezifischen Tags.

```
<f:subview id="menu">
...
</f:subview>
```


----------



## freez (6. Okt 2007)

Ja, ich habe auch so meine Erfahrungen mit Tiles und JSF gemacht. Ich hatte das lustige Phänomen das ich ein Projekt erstellt hatte, da trat das gleiche Problem wie bei dir auf und dann habe ich ein neues Projekt in MyEclipseIDE erstellt und genau die gleichen Schritte gemacht (sogar Codeschnipsel mit dem alten Projekt ausgetauscht). Und es ging.

Ich habe ein PDF erstellt, welches du dort: 

www.java-forum.org/de/viewtopic.php?p=278964&highlight=#278964
finden kannst. Wenn du MyEclipseIDE verwendest kannst du das Beispiel mal nachstellen und kommst vielleicht darauf, woran es hängt.

Ansonsten fällt mir auf den ersten Blick nicht auf, woran es hacken könnte.


----------



## nightpoet (12. Okt 2007)

Hallo zusammen

Danke für die Hilfe

Habe das Problem nun mit Facelets gelöst und es klappte nahezu auf anhieb!

Viele Grüße,
Christian


----------

