Frage

Ich versuche zu integrieren Sitemesh in eine Legacy -Anwendung mit Tomcat 5 als meinen Container. Ich habe ein main.jsp Dass ich mit einem einfachen Dekorateur dekoriere.

Im decorators.xml, Ich habe gerade einen Dekorateur definiert:

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

Dieser Dekorateur arbeitet, wenn ich manuell gehe http://example.com/my-webapp/jsp/main.jsp. Es gibt jedoch einige Orte, an denen ein Servlet, anstatt eine Weiterleitung zu einem JSP zu machen, a nach vorne:

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

Dies bedeutet, dass die URL bei so etwas bleibt http://example.com/my-webapp/servlet/MyServlet Anstelle der JSP -Datei und daher nicht dekoriert, nehme ich an decorators.xml.

Ich kann keine machen <pattern>/*</pattern> Weil es andere JSPs gibt, die nicht von dekoriert werden müssen layout-main.jsp. Ich kann keine machen <pattern>/servlet/MyServlet*</pattern> Weil MyServlet kann vorwärts zu main.jsp manchmal und vielleicht error.jsp zu anderen Zeiten.

Gibt es eine Möglichkeit, dies zu bearbeiten, ohne dass sich die Funktionsweise der Servlets um expansive Änderungen angeht? Da es sich um eine Legacy-App handelt, habe ich nicht so viel Freiheit, Dinge zu ändern. Ich hoffe auf etwas Konfiguration, das dies behebt.

Sitemeshs Dokumentation ist wirklich nicht so toll. Ich habe hauptsächlich aus der Beispielanwendung gearbeitet, die mit der Verteilung einhergeht. Ich mag Sitemesh sehr und hoffe, dass ich es in diesem Fall zum Laufen bringen kann.

War es hilfreich?

Lösung

Mein Verständnis ist, dass Sitemesh als Servlet -Filter in die Anwendung integriert ist. Standardmäßig werden Servlet -Filter nur gegen die ursprüngliche eingehende Anfrage aufgerufen (in Ihrem Fall die Anfrage an das Servlet). Nachfolgende Vorwärts- oder Einschließungsanträge werden nicht durch den Filter weitergegeben und werden daher nicht durch Sitemesh weitergegeben.

Sie können jedoch den Filter anweisen, auf Stürmer aufzurufen, indem Sie so etwas verwenden:

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

Dies weist den Container an, nur zu Forward -Anfragen zu arbeiten. Die anderen Optionen sind enthalten und anfordern, Sie können mehrere Elemente haben.

Ihre Optionen sind also, entweder Ihre Filterkonfiguration zu ändern, um weiter vorwärts zu angegeben, oder um Ihr Filtermapping so zu ändern, dass er dem Servlet-Pfad entspricht, anstatt dem JSP-Pfad. Beide sollte funktionieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top