Struts 2 mit Tiles 2 konfigurieren

Hallo!
Danke für die Antworten, konnte mich in letzter Zeit nur wenig mit dem Problem befassen.
Das eine Struts2/Tiles2 Projekt läuft immernoch nicht... Eingetragen (web.xml, tiles.xml, ...) sind alle gemacht, trotzdem erhalte ich beim Starten des Server 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)
Dieses Projekt nutzt Struts 2.0.9 sowie Tiles 2.0.4.

Ich habe im Internet aber ein anderes leeres Struts/Tiles Projekt gefunden, welches Struts 2.0.6 und Tiles 2.0 nutzt. Dieses Projekt kann ich ohne Probleme mit meinem Server starten und es funktioniert auch.

Über jeden Hinweis wie ich die aktuelle Struts / Tiles Version zum laufen bekomme würd ich mich freuen.

mfg flo
 
java.lang.NoClassDefFoundError: org/apache/commons/digester/Rule

commons-digester-1.8.jar in den "lib"-Ordner stecken.... (kriegste auf der apache Seite).

Kann gut sein das du danach weitere Fehler dieser Art bekommst; dann einfach die zugehörigen *.jar-Files ins Projekt mit einbinden (stehen in meinem vorherigem Post).

MfG
Syn4pSE
 
Hallo Flo,
leider habe ich es nicht früher geschafft.

Vorab noch eine Frage an SYn4pSE:
Auf welche Tiles-Version beziehst Du Dich?
Derzeit aktuelle Version von Tiles 2 ist v. 2.0.4 (beta); meine Erfahrungen beruhen auf v. 2.0.3 .
Außerdem habe ich Struts 2.0.9 noch nicht installiert, das folgt in den nächsten Tagen und dann werde ich Deine Empfehlungen mal ausprobieren. Ich bin gespannt.

Ich kann derzeit nur zum Stand Struts 2.0.6 und Tiles 2.0.3 berichten.
Hierzu habe ich Anfang Mai von einem der beteiligten Entwickler (Antonio Petrelli) die ausdrückliche Stellungnahme erhalten, dass diese beiden Versionen nicht miteinander kompatibel seien.
http://www.nabble.com/InsertAttribu...e-'header'-not-found-tf3712428.html#a10389529

Allerding enthält das Struts 2 Paket selbst eine frühe Tiles-Version, die offenbar zu einem relativ frühen Zeitpunkt aus der als Standalone-Produkt geplanten Tiles 2-Entwicklung ausgekoppelt wurde. Diese wird offiziell als "Struts 2 Tiles" bezeichnet.

Daraus ergeben sich teils kuriose Folgen. In einigen Bereichen nutzt dies Struts 2-eigene Fassung noch die ältere Tiles-Syntax, in anderen hingegen bereits die neuere.
Auf die passende Kombination bin ich nur durch Zufall gestoßen, als ich nach der negativen Antwort (s.o.) Rückbau betrieben habe. Dazu unten mehr.

Die Dokumentation zu Struts 2 Tiles ist mit der zum Schluss rasanten Entwicklung von Struts 2 Anfang des Jahres offenbar nicht ganz mitgekommen. Jedenfalls sind die Beispiele dort in einigen Bereichen veraltet.

Aber jetzt mal systematisch, wie es bei mir funktioniert.

Zunächst ist darauf zu achten, das Tiles 2 die Servlet-Spezifikation v 2.4 oder höher voraussetzt. Der Kopf des Deployment-Deskriptors (web.xml) muss daher folgendermaßen aussehen:

Code:
<web-app 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/web-app_2_4.xsd"
	      version="2.4">

Weiterhin müssen folgende Abschnitte in web.xml eingefügt werden:

Code:
<filter>
    <filter-name>Tiles Filter</filter-name>
    <filter-class>org.apache.tiles.filter.TilesFilter</filter-class>
    <init-param>
        <param-name>org.apache.tiles.DEFINITIONS_CONFIG</param-name>
        <param-value>/WEB-INF/tiles-defs.xml</param-value>
    </init-param>
</filter>

Code:
<init-param>
    <param-name>chainConfig</param-name>
    <param-value>org/apache/struts/tiles/chain-config.xml</param-value>
</init-param>

Code:
<listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>
</listener>

Anpassen der Package-Definitionen in struts.xml

Die packages, die mit Tiles arbeiten sollen, müssen modifiziert werden, indem das Attribut 'extends' auf "tiles-dafult" anstelle von "struts-default" verweist.

Code:
<struts>
    <package name="[package-name]" extends="tiles-default">
       ...
    </package>
</struts>

Damit wird auf die Datei 'struts-plugin.xml' in 'struts2-tiles-plugin-2.0.6.jar' Bezug genommen. Das dortige Package "tiles-default" erweitert seinerseits "struts-default" durch einen <result-type>-Eintrag, der auf TilesResult verweist.

Soweit die Basis-Konfiguration.
Die Anwendung von Tiles dreht sich um zwei Dateitypen, einmal die Definitionsdatei 'tiles-defs.xml' und zum anderen die Template-JSPs. Und hier wird's kurios.
Während die JSPs bereits die neuere Syntax von Tiles 2 (v 2.0.3 aufwärts) verwenden und die Definitionsdatei bereits den modernen Namen 'tiles-defs.xml' trägt, wird in der Definitionsdatei noch die ältere Syntax wie bei Tiles 1 verwendet, also obacht!

Aufbau der Definitionsdatei tiles-defs.xml

Wichtig ist die Angabe der richtigen DTD:

Code:
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "org/apache/struts/resources/tiles-config_2_0.dtd">
       
<tiles-definitions>
       <definition name="basicLayout" template="/jsp/tiles/hv_main.jsp">
              <put name="header" type="template" value="/jsp/tiles/header.jsp" />
        </definition>
</tiles-definitions>

Aufbau der Template-JSPs

Wichtig ist hier vor allem die neue URI, die sich auf tiles.apache.org anstelle von struts.apache.org bezieht. Entsprechend ist hier die neue Syntax zu verwenden.
Die URI muss natürlich in allen Template-JSPs enthalten sein:

Code:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>

<html>
    <head>
    </head>
    
    <body>
        <tiles:insertAttribute name="header" />
        <div id="body">this is the body</div>
    </body>
</html>

Ist 'ne Menge Holz, ich weiß.
Aber vor allem hast Du hier die korrekten Header bzw. DTD-Verweise für die Steuerdateien.
Die richtige Kombination herauszubekommen, ist wahrlich ein Glücksspiel.

Der Aufwand lohnt sich aber allemal.
Tiles sind eine super Ergänzung, vor allem zu dem genialen Wurf von Struts 2.
Meine Hochachtung an die Entwickler. Um diese selbst zu zitieren:
"Struts 2 is what Struts always has been intended to be".

Viel Glück,
moenicke
 
OK SYn4pSE, werde ich demnächst probieren.
Wäre ja schön, wenn das ausgekoppelte Tiles 2 wieder mit Struts 2 kompatibel wäre.
 
Hallo!

Vielen vielen Dank!

Bin leider nicht eher dazugekommen Alles auszuprobieren, aber mittlerweile startet mein Tomcat ohne dass er eine Exception wirft :) Und das Ganze mit Struts 2.0.9 und Tiles 2.0.4. Im Moment zeigt er die Seite zwar noch nicht korrekt an, weil irgendwo ein Pfad nicht stimmt, aber das dürfte jetzt kein großes Problem mehr sein.

mfg flo
 
OK, ja, Struts 2.0.9 ist tatsächlich kompatibel mit Tiles 2.0.4; letzteres ist sogar als Plug-In direkter Bestandteil des Struts-Paketes geworden (allerdings mit späterem Zeitstempel, also besser die integrierten JARs verwenden).

Im Prinzip sind die nötigen Schritte im Tutorial zu Tiles 2 beschrieben:
http://tiles.apache.org/tutorial/index.html

Der Umstieg von Struts 2.0.6 nach v. 2.0.9 birgt allerdings ein paar Fallen, die hier zur Info kurz angesprochen werden sollen:

- alle JSPs, die Tiles-Tags verwenden, müssen neu kompiliert werden, sonst steht noch der Verweis auf die alte TLD drin und führt zu einer ClassNotFoundException. Am besten die entsprechenden Klassen im work-Verzeichnis des Web-Containers (z.B. Tomcat) löschen und damit ihre Neuerstellung erzwingen.

- die Art und Weise, wie Templates in den Tiles-Definitionen verwendet werden dürfen, hat sich geändert. Die Tiles-Version, die mit Struts 2.0.6 mitkam, erlaubte noch das beliebige Schachteln von Definitionen per Extension, wobei in jeder Ebene neue Templates eingebaut und gleichzeitig sämtliche Attribute der übergeordenten Ebenen überschrieben werden konnten. Das klappt ab Tiles 2.0.4 nicht mehr, zumindest nicht gleicher Weise.

Dieses Verhalten wird etwas kryptisch unter den FAQ (leider nicht im Tutorial) angesprochen:
http://tiles.apache.org/faq.html
Dort vorletzte Frage unter "Technical Questions".

Wie sich das auswirkt, kann man hier nachlesen:
http://www.nabble.com/Nesting-tiles-3-levels-deep-not-finding-attribute-tf4179213.html#a11884042

Flo[H], wenn Du weiterhin Schwierigkeiten mit der Konfiguration hast, kann ich noch einmal eine "step-by-step"-Anleitung posten.
 
Hallo!
Wie gesagt Struts und Tiles laufen an sich schon, hab bloß ein Projekt schnell zurecht kopiert um es zu testen und dabei findet er ein paar Dateien noch nicht. Der Fehler liegt aber am kopieren und nicht an der Konfiguration.
Von daher benötige ich keine Anleitung mehr, aber ich denke dass so eine Anleitung sich in der Tutorials-Ecke recht gut tuen würde, falls du zuviel Zeit hast :)

mfg flo
 
Hm, zuviel Zeit ... :rolleyes:
Das zwar nicht, aber ich habe satte zwei Tage mit den Irrungen und Wirrungen des Umstiegs zugebracht, das wollte ich anderen gern ersparen und jetzt ist's noch frisch gewesen.

Vielleicht mache ich tatsächlich mal ein Tutorial daraus - wenn ich zuviel Zeit habe ... :)
 
Zurück