Struts 2 mit Tiles 2 konfigurieren

Flo<H>

Erfahrenes Mitglied
Hallo!
Ich versuche gerade mich in Struts 2 einzuarbeiten. Habe zuvor noch nichts mit Web-Frameworks gemacht. Mittlerweile läuft hier Struts 2 ohne Probleme und ich habe ein paar Beispiele durchgemacht.
Nun wollte ich aber versuchen eine Seite mit Tiles 2 zu bauen. Hab dazu erstmal gegoogelt und nur folgendes gefunden:
http://struts.apache.org/2.x/docs/tiles-plugin.html
http://bridee.blogspot.com/2007/05/struts-2-tiles-2.html
http://www.developpez.net/forums/showpost.php?p=2067624&postcount=6

Also hab ich mich erst mal an die beiden letzten Links gehalten: per Eclipse neues Tomcat Projekt angelegt, struts2-blank.war inportiert und dann wie in den Links oben die Dateien angepasst.
Wenn ich anschließend aber meinen Tomcat in Eclipse neustarte erhalte ich folgende Exception:
Code:
SCHWERWIEGEND: Error configuring application listener of class org.apache.struts2.tiles.StrutsTilesListener
java.lang.ClassNotFoundException: org.apache.struts2.tiles.StrutsTilesListener
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1359)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1205)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3712)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:448)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)]

Als Listener habe ich folgende Beide ausprobiert:
org.apache.tiles.listener.TilesListener
org.apache.struts2.tiles.TilesListener
Beide Male ClassNotFound.

Libs sollten alle im Projekt eingebunden sein. Habe sie per "Externe Archive hinzufügen" in Eclipse importiert.

Freue mich über jede Antwort :)

mfg flo
 
Hallo!
Wenn zu meinem obigen Problem keiner eine Lösung weiß, weiß ja jemand vielleicht eine kleine Struts2 Beispielanwendung mit Tiles?
mfg flo
 
Bist du dir sicher, dass die Lib mit deployt wird? Du hast ein Dynamic Web Project nehm ich an? Dann musst du Libs, die in den COntainer deployt werden sollen noch per Projekt -> Rechtsclick -> Properties -> "irgendwas wie J2EE Dependencies" hinzufügen.

Dann sollte Eclipse das mit in den Tomcat deployen, wenn du Run as -> Run on Server... machst.

Gruß
Ollie
 
Hallo!
Genau das ist glaub ich das Problem. Bei einem der Beispiele war etwas dabei, dass man eine Abhängigkeit eintragen muss, dort war aber nur beschrieben wie das mit Maven geht.

Unter den Projekt Eigenschaften hab ich nichts mit J2EE Dependencies. Ich verwende das Sysdeo-Plugin. Das Projekt ist ein Tomcat-Projekt.

Das Einzige was ich unter den Eigenschaften gefunden hab ist dass ich da den DevLoader aktivieren kann und ich dort meinen externen Libs auswählen kann. Die Klasse findet er aber trotzdem nicht.

mfg flo
 
Hm... mir is rätselhaft, warum alle Welt immer für so Standardaufgaben irgendwelche extravaganten Plugins benutzt. Sowas kann Eclipse mit dem WTP von Haus aus.

Tut mir leid, mit dem Plugin kenn ich mich nicht aus...

Gruß
Ollie
 
Hallo!

Schonmal Danke für deine Hilfe :)

Hab das Ganze gerade mit dem WTP ausprobiert:
-Dynamic Web Project angelegt
-Struts-blank importiert
-web.xml und struts.xml angepasst
-Projekt-Eigenschaft -> J2EE Module Dependecies -> externe Jars hinzugefügt
-Server eingerichtet (Tomcat 5.5)
-Run on Server
=> java.lang.ClassNotFoundException: org.apache.tiles.listener.TilesListener
bzw: java.lang.ClassNotFoundException: org.apache.struts2.tiles.TilesListener

Hast du vielleicht noch eine Idee?

mfg flo
 
So, mittlerweile hab ichs geschafft, dass die Library anscheinend geladen wird, zumindest habe ich keine ClassNotFoundException mehr. Worans jetz lag kann ich aber nicht genau sagen.

Aber mittlerweile habe ich das nächste Problem: beim Starten des Servers erhalte ich jetzt folgende Exception:
Code:
SCHWERWIEGEND: Exception sending context initialized event to listener instance of class org.apache.struts2.tiles.StrutsTilesListener
java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule
	at org.apache.tiles.definition.UrlDefinitionsFactory.init(UrlDefinitionsFactory.java:118)
	at org.apache.tiles.impl.BasicTilesContainer.initializeDefinitionsFactory(BasicTilesContainer.java:185)
	at org.apache.tiles.impl.BasicTilesContainer.init(BasicTilesContainer.java:121)
	at org.apache.tiles.factory.TilesContainerFactory.initializeContainer(TilesContainerFactory.java:232)
	at org.apache.tiles.factory.TilesContainerFactory.createTilesContainer(TilesContainerFactory.java:198)
	at org.apache.tiles.factory.TilesContainerFactory.createContainer(TilesContainerFactory.java:163)
	at org.apache.tiles.web.startup.TilesListener.createContainer(TilesListener.java:90)
	at org.apache.struts2.tiles.StrutsTilesListener.createContainer(StrutsTilesListener.java:66)
	at org.apache.tiles.web.startup.TilesListener.contextInitialized(TilesListener.java:57)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:448)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)

Nach ein bischen googeln bin ich auf folgende Lösung gestoßen:
Code:
You have to put in "web.xml" the "definitions-config" init parameter, 
that points to your Tiles definitions xml file or you can use the 
default name, under /WEB-INF/tiles.xml
Ich verwende aber eben dieses tiles.xml im WEB-INF Verzeichnis!? Nur eclipse bringt mir bei eben diesem File eine Warnung dass es den Doctype nicht finden kann:
Doctype:
Code:
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://struts.apache.org/dtds/tiles-config_2_0.dtd">

Warnung:
Code:
The file cannot be validated as the XML Schema "http://struts.apache.org/dtds/tiles-config_2_0.dtd" that is specified as describing the syntax of the file cannot be located.

Bin über jede Hilfe dankbar.
flo
 
Das is dann wohl ein Eclipse lokales Warning... Bei Apache sind die DTD URIs meistens virtuell, d.h. die existieren da nicht wirklich unter der URL.

Du kannst über Preferences -> Web and XML -> XML Catalog aber einfach DTD URIs auf lokale DTDs mappen. Die DTD sollte mit in einem der JARs liegen.

Gruß
Ollie
 
Hallo Flo,

ich hatte gerade einen länglichen Beitrag für Dich zusammen gestellt, der mir leider per Timeout weggeschossen wurde.

Ich muss ihn also offline wieder neu formulieren.
Das schaffe ich aber erst am Wochenende.

Als kurzen Hinweis vorab:

Tiles 2 ist nicht mit Struts 2 kompatibel, man muss das mitgelieferte Plugin von Struts 2 verwenden.
Das Plugin stellt einen Zwischenstand auf dem Weg nach Tiles 2 dar, der irgendwann Anfang des Jahres eingefroren wurde. Dadurch kommt es zu einer seltsamen Vermischung alter und neuer Deklarationen und Syntaxversionen.

Erläutere ich in meinem nächsten Beitrag am WE.

Bis dahin Ohren steif halten - mich hat die Lösung einige Wochen gekostet!

Gruß,
moenicke
 
Also bei mir ist Tiles 2 mit Struts 2 kompatibel. Hat zwar ein wenig gedauert aber jetzt funktioniert ‘s!
In den „lib“-Ordner musste ich…
… commons-beanutils-1.6.jar
…commons-collections-3.2.jar
…& commons-digester-1.8.jar
neben den üblichen „tiles“-jars haun.

In die „web.xml“ kommt dann folgendes...
Code:
<listener>
  <listener-class>
	  org.apache.struts2.tiles.StrutsTilesListener
  </listener-class>
</listener>

In die „struts.xml“ kommt…
Code:
<result-types>
   <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>	
</result-types>
und deine action(s) muss/müssen hier angepasst werden.
Code:
<action name="ACTION-AUFRUF" class="PAKET.ACTIONKLASSE">
  <result type="tiles">TILES-AUFRUF</result>
</action>

Jetzt brauchst du noch ‘ne „tiles.xml“ (kommt ins „WEB-INF“-Verzeichnis) mit Beispielsweise folgendem Inhalt...
Code:
<tiles-definitions>
	<definition name="TILES-AUFRUF" template="/LAYOUT.JSP">
	    <put-attribute name="navigation" value="/NAVIGATION.JSP"/>
	    <put-attribute name="body" value="/WAS_AUCH_IMMER.JSP"/>
	</definition>
</tiles-definitions>

Fehlt nur noch die Seite mit dem Layout, welche in diesem Fall ungefähr so aussehen kann….
Code:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
</head>
<body>
<table>
	<tr>
		<td><tiles:insertAttribute name="navigation" /></td>
		<td><tiles:insertAttribute name="body" /></td>
	</tr>
</table>
</body>
</html>


Hoffe ich konnte helfen....

MfG,
SYn4pSE
 
Zurück