2009-03-06 9 views
5

estoy tratando de integrar SiteMesh en una aplicación heredada utilizando Tomcat 5 como mi un recipiente. Tengo un main.jsp que estoy decorando con un simple decorador.SiteMesh con el delantero de RequestDispatcher()

En decorators.xml, sólo tengo un decorador definido:

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

Este decorador funciona si voy a http://example.com/my-webapp/jsp/main.jsp manualmente. Sin embargo, hay algunos lugares en los que un servlet, en lugar de hacer una redirección a una página JSP, hace un forward:

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

Esto significa que la URL se mantiene en algo así como http://example.com/my-webapp/servlet/MyServlet en lugar del archivo JSP y por lo tanto no es estoy decorado, supongo que ya que no coincide con el patrón en decorators.xml.

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

¿Hay una manera de solucionar esto sin cambios expansivos a cómo funcionan los servlets? Dado que es una aplicación heredada, no tengo tanta libertad para cambiar las cosas, así que espero algo de configuración que solucione esto. documentación

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

Respuesta

9

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

Puede, sin embargo, dar instrucciones al filtro para invocar en adelante, usando algo como esto:

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

que instruye el contenedor para operar sólo en transmitir las peticiones. Las otras opciones son INCLUDE y REQUEST, puede tener varios elementos.

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

+1

Esto funcionó, aplicar el filtro a la solicitud enviada y aplicando así el decorador SiteMesh a la página JSP reenviado. ¡Gracias! –

+1

Gracias skaffman, ¡esto fue solo una ENORME ayuda para mí! –

+1

Había visto esas nuevas directivas pero todavía no las necesitaba. Buen consejo. –

Cuestiones relacionadas