2009-03-06 12 views
5

Ich versuche, SiteMesh in eine Legacy-Anwendung mit Tomcat 5 als meine Container zu integrieren. Ich habe eine main.jsp, die ich mit einem einfachen Dekorateur dekoriere.Verwenden von SiteMesh mit RequestDispatcher forward()

In decorators.xml, ich habe nur einen Dekorateur definiert habe:

<decorators defaultdir="/decorators"> 
    <decorator name="layout-main" page="layout-main.jsp"> 
    <pattern>/jsp/main.jsp</pattern> 
    </decorator> 
</decorators> 

Dieser Dekorateur funktioniert, wenn ich manuell http://example.com/my-webapp/jsp/main.jsp gehen. Allerdings gibt es ein paar Orte, wo ein Servlet, anstatt eine Umleitung auf eine jsp zu tun, tut ein forward:

getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response); 

Dies bedeutet, dass die URL an so etwas wie http://example.com/my-webapp/servlet/MyServlet bleibt statt der jsp-Datei und ist daher nicht dekorieren, nehme ich an, da es nicht das Muster in decorators.xml entspricht.

Ich kann keine <pattern>/*</pattern> tun, weil es andere Jsps gibt, die nicht von layout-main.jsp dekoriert werden müssen. Ich kann kein <pattern>/servlet/MyServlet*</pattern> tun, weil MyServlet manchmal zu main.jsp manchmal und error.jsp zu anderen Zeiten weiterleiten kann.

Gibt es eine Möglichkeit, dies zu umgehen, ohne dass die Servlets stark verändert werden müssen? Da es sich um eine Legacy-App handelt, habe ich nicht so viel Freiheit, Dinge zu ändern, also hoffe ich auf etwas Konfigurationsmäßiges, das das beheben wird.

Die Dokumentation von SiteMesh ist wirklich nicht so toll. Ich habe hauptsächlich an der Beispielanwendung gearbeitet, die mit der Distribution geliefert wird. Ich mag SiteMesh sehr und hoffe, dass ich es in diesem Fall zum Laufen bringen kann.

Antwort

9

Mein Verständnis ist, dass SiteMesh als Servlet-Filter in die Anwendung integriert ist. Standardmäßig werden Servlet-Filter nur für die ursprüngliche eingehende Anfrage (in Ihrem Fall die Anfrage an das Servlet) aufgerufen. Nachfolgende Forward- oder Include-Anforderungen werden nicht durch den Filter übergeben und werden daher nicht über Sitemesh übergeben.

Sie können jedoch anweisen, die Filter werden auf vorwärts aufgerufen, so etwas wie dies mit:

<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <servlet-name>MyServlet</servlet-name> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

, die den Behälter auf FORWARD-Anfragen nur funktionieren anweist. Die anderen Optionen sind INCLUDE und REQUEST, Sie können mehrere Elemente haben.

Sie können also entweder Ihre Filterkonfiguration ändern, um FORWARD anzugeben, oder die Filterzuordnung so ändern, dass sie dem Servletpfad und nicht dem JSP-Pfad entspricht. Entweder sollte man arbeiten.

+1

Dies funktionierte, indem der Filter auf die weitergeleitete Anfrage angewendet wurde und somit der SiteMesh-Decorator auf die weitergeleitete JSP-Seite angewendet wurde. Vielen Dank! –

+1

Danke skaffman, das war nur eine riesige Hilfe für mich! –

+1

Ich hatte diese neuen Richtlinien gesehen, aber noch keine Notwendigkeit für sie. Guter Rat. –