# MyFaces und Tiles: <tiles:insert> wird nicht erkannt



## freez (18. Feb 2007)

Hallo Leute,

ich habe ein Problem mit der Tag Erkennung in einem Projekt. in MyEclipseIDE wird mir das Tag <tiles: .... nicht erkannt. Auch wenn ich es ignoriere und es dennoch auf Tomcat deploye, dann bringt mir Tomcat Fehlermeldungen.

Ich habe bereits ein Projekt, in denen das ganze geklappt hat. Ich habe mir extra eine Anleitung dazu erstellt, und nach der mein aktuelles Projekt erstellt. Aber Eclipse meckert jedes mal bei dem Tag <tiles:. Eclipse erkennt kein einziges Tiles Tag. Siehe auch Screenshot dazu:







Der Vollständigkeit halber:

web.xml:


```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
    <init-param>
      <param-name>maxFileSize</param-name>
      <param-value>20m</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>*.jsf</url-pattern>
  </filter-mapping>
	<context-param>
		<description>Tiles Definitionen</description>
		<param-name>tiles-definitions</param-name>
		<param-value>/WEB-INF/tiles.xml</param-value>
	</context-param>

</web-app>
```

die faces-config.xml:


```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

<faces-config>
	<application>
		<view-handler>
			org.apache.myfaces.application.jsp.JspTilesViewHandlerImpl
		</view-handler>
	</application>
	<managed-bean>
		<managed-bean-name>memoryHandler</managed-bean-name>
		<managed-bean-class>
			memory.handler.MemoryHandler
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
	<navigation-rule>
              
	    
        </navigation-rule>
</faces-config>
```

und die tiles.xml:


```
<!DOCTYPE tiles-definitions PUBLIC
   "-//Apache Software Foundation//DTD Tiles Configuration//EN"
   "http://jakarta.apache.org/struts/dtds/tiles-config.dtd">

<tiles-definitions>
	<definition name="layout.playground" path="/pages/template.jsp">
	</definition>

	<!--Workaround fuer Nicht-Tile-Seiten.
		Da der ViewHandler über ".tiles" geht, müssen alle Seiten so
		verwendet werden. Navigationsregeln nicht vergessen!
	-->
    <definition name="non.tiles" path="/pages/nicht-tile-seite.jsp" />


</tiles-definitions>
```

Was habe ich da verkehrt gemacht?


----------



## raynic35 (27. Feb 2007)

Hi,

ich hatte das gleiche Problem auch schon einmal. Bei mir hat es sich erledigt, als ich struts.jar mit eingebunden habe. Aber das hast du ja... probier mal ein clean auf dein Projekt zu machen. Benutzt du das JSF-Plugin für WTP? Ich glaube das ist noch ziemlich buggy. Kannst du mich mit dem Problem auf dem Laufenden halten? Ich habe im Moment ein ähnliches Projekt, nur auf einem JBoss und hänge auch gerade etwas.

Gruss ray


----------



## freez (27. Feb 2007)

Das Problem habe ich nicht gelöst. Ich wollte einfach nur die struts.jar hinzufügen und fertig. Auch als ich dann die entsprechende tld eingefügt hatte, wurde es nicht erkannt. Ist schon verzwickt.

Ich habe dann ein neues Projekt angelegt, und dann in der MyEclipseIDE im Menu MyEclipse den Punkt Add Struts Capabilities gewählt. Damit ging es dann. Die JSPs und tiles.xml habe ich dann aus dem alten Projekt eins zu eins übernommen.

Naja, das Komische daran ist einfach, dass es schon mal mit dem ersten Weg in einem anderen Projekt funktioniert hat. Kann es sein, daß in der faces-config.xml oder web.xml irgendwelche Eintragungen vorgenommen werden müssen? Ich habe das neue Projekt mit dem Alten verglichen und die ein oder andere neue Einstellung ins alte Projekt übernommen, aber es hat sich nichts geändert. Ich kann mir es auch nicht so ganz erklären, daß es an den beiden Dateien liegen soll.


----------



## freez (27. Feb 2007)

Wer Interesse hat, kann sich diesen kleinen Leitfaden zur Benutzung mit Tiles und MyFaces in der MyEclipseIDE von mir runterladen:

Projekt in MyEclipseIDE mit Tiles und MyFaces anlegen.pdf

Das habe ich mir selbst erstellt, als einfache Doku.

Beste Grüße
Denis


----------



## navino (30. Mrz 2007)

Hallo 

habe nach der Anleitung MyEclipse - Tiles- Struts ein Projekt angelegt.
Meine Frage: Wie rufe is z.b. die kontenübersicht auf.

Wenn ich in der index.jsp:

<html>
 <body>
  <jsp:forward page="/pages/kontenuebersicht.tiles" />
 </body>
</html>

kommt ein 404 fehler:

wenn ich:
<html>
 <body>
  <jsp:forward page="/pages/kontenuebersicht.jsf" />
 </body>
</html>

bekomme ich folgendes:

org.apache.jasper.JasperException: Exception in JSP: /index.jsp:3

1: <html>
2:  <body>
3:   <jsp:forward page="/pages/kontenuebersicht.jsf" />
4:  </body>
5: </html>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:506)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

javax.servlet.ServletException: The absolute uri: http://struts.apache.org/tags-tiles cannot be resolved in either web.xml or the jar files deployed with this application
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:121)
	org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:688)
	org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:658)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:46)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

javax.faces.FacesException: The absolute uri: http://struts.apache.org/tags-tiles cannot be resolved in either web.xml or the jar files deployed with this application
	org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:421)
	org.apache.myfaces.application.jsp.JspTilesViewHandlerImpl.dispatch(JspTilesViewHandlerImpl.java:233)
	org.apache.myfaces.application.jsp.JspTilesViewHandlerImpl.renderView(JspTilesViewHandlerImpl.java:219)
	org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:352)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:107)
	org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:688)
	org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:658)
	org.apache.jsp.index_jsp._jspService(index_jsp.java:46)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Was mache ich falsch ??

Gruß
navino


----------



## freez (30. Mrz 2007)

Hallo navino,

also, in meinem Beispiel muß der Aufruf so lauten: http://localhost:8080/***Projektname***/pages/kontenuebersicht.jsf (also http://localhost:8080/***Projektname*** musst du natürlich deinen Anforderungen anpassen).

kann es sein, daß du in deiner URL den Projektnamen vergessen hast?

Die Fehlermeldungen deuten darauf hin, daß dem System evtl. die struts-tiles.tld fehlt.

Beste Grüße
Denis


----------



## freez (30. Mrz 2007)

Ich habe einen kleinen Test mit meinem Projekt, welches auf die Doku beruht, gemacht:

folgende test.jsp habe ich im WebRoot Ordner abgelegt:


```
<%@ page language="java" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
	<base href="<%=basePath%>">

	<title>My JSF 'test.jsp' starting page</title>
	
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

</head>
  
<body>
	<f:view>
		<jsp:forward page="/pages/kontenuebersicht.jsf"></jsp:forward>
	</f:view>
</body>
</html>
```

Aufruf: http://localhost:8080/TilesMyFaces6/test.jsf
Und, was soll ich sagen, es geht


----------



## navino (30. Mrz 2007)

Hallo und danke für die schnelle Hilfe,

es klappt jetzt soweit mit tiles.
was noch nich klappt sind seiten die nicht über tiles gesteuert werden.

Den Workaround :
<!--Workaround fuer Nicht-Tile-Seiten.
Da der ViewHandler über ".tiles" geht, müssen alle Seiten so
verwendet werden. Navigationsregeln nicht vergessen!
-->
<definition name="non.tiles" path="/pages/nicht-tile-seite.jsp" />
</tiles-definitions>

verstehe ich auch noch nicht.

Wie rufe ich eine Seite auf die nicht über tiles gehen soll?

Gruß
navino


----------



## freez (31. Mrz 2007)

also meine test.jsp habe ich einfach ins WebRootVerzeichniss geschmissen und per http://hostname:port/projektname/test.jsf aufgerufen. Diesen Workaround verstehe ich auch nicht so ganz. Ich habe es aus einem Tutorial oder Buch (welches, weiß ich nicht mehr). Da wurde nicht näher darauf eingegangen.

Das mit den zig verschiedenen Dateiendungen ist für mich auch nicht ganz zu verstehen (deswegen habe ich ja die Doku geschrieben, damit ich das schnell wieder nachvollziehen kann). Da gibt es jsp, jsf und tiles. Dateiendungen mit .tiles habe ich nirgendswo erstellt ... nur  in der tiles.xml benutzt. alle Dateien enden bei mir mit .jsp aber aufrufen tue ich alle mit .jsf. Also schon etwas verwirrend (gerade das mit .tiles)


----------



## navino (31. Mrz 2007)

Hallo,

das mit den Dateiendungen verstehe ich wohl.... Wenn eine jsp-seite im Webroot liegt, kann man sie über die URL aufrufen. z.B http:localhost/projekt/test.jsp. Wenn die test.jsp aber unterhalb des WEB-INF liegt, sagt die Servlet-Spezifikation, das man diese Dateien nicht direkt aufrufen kann, sondern nur aus der Applikation selber, entweder über eine Action oder über navigation-rule. 
Da ich aber alle jsps außer die index.jsp im WEB-INF packen möchte( Aus Sicherheitsgründen) ist jetzt die Frage wie komme ich da dran....


Gruß
navino


----------



## freez (31. Mrz 2007)

Die Frage kann ich dir nicht beantworten. Ich bin noch nicht auf die Idee gekommen sowas zu machen.


----------

