Pregunta

Estoy intentando integrar SiteMesh en una aplicación heredada usando Tomcat 5 como mi contenedor. Tengo un main.jsp que estoy decorando con un simple decorador.

En decorators.xml, acabo de definir un decorador:

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

Este decorador funciona si voy manualmente a http://example.com/my-webapp/jsp/main.jsp. Sin embargo, hay algunos lugares donde un servlet, en lugar de hacer una redirección a un jsp, hace un adelante :

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

Esto significa que la URL permanece en algo así como http://example.com/my-webapp/servlet/MyServlet en lugar del archivo jsp y, por lo tanto, no está decorada, supongo, ya que no coincide con el patrón en <pattern>/*</pattern>.

No puedo hacer un layout-main.jsp porque hay otros jsps que no necesitan ser decorados por <pattern>/servlet/MyServlet*</pattern>. No puedo hacer un MyServlet porque error.jsp puede reenviar a <=> algunas veces y quizás <=> en otras ocasiones.

¿Hay alguna forma de evitar esto sin cambios expansivos en la forma en que funcionan los servlets? Dado que es una aplicación heredada, no tengo tanta libertad para cambiar las cosas, así que espero algo relacionado con la configuración que solucione esto.

La documentación de SiteMesh realmente no es tan buena. He estado trabajando principalmente en la aplicación de ejemplo que viene con la distribución. Realmente me gusta SiteMesh, y espero poder hacerlo funcionar en este caso.

¿Fue útil?

Solución

Entiendo que SiteMesh está integrado en la aplicación como un filtro de Servlet. Por defecto, los filtros de servlet solo se invocan contra la solicitud entrante original (en su caso, la solicitud al servlet). Las solicitudes de reenvío o inclusión posteriores no se pasan a través del filtro y, por lo tanto, no se pasarán a través de sitemesh.

Sin embargo, puede indicarle al filtro que se invoque hacia adelante, usando algo como esto:

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

Que le indica al contenedor que opere solo en solicitudes FORWARD. Las otras opciones son INCLUIR y SOLICITAR, puede tener varios elementos.

Entonces, sus opciones son cambiar la configuración del filtro para especificar ADELANTE, o cambiar la asignación del filtro para que coincida con la ruta del servlet, en lugar de la ruta JSP. Cualquiera de los dos debería funcionar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top