2009-03-06 6 views
5

Je tente d'intégrer SiteMesh dans une application héritée en utilisant Tomcat 5 comme conteneur. J'ai un main.jsp que je décore avec un décorateur simple.Utilisation de SiteMesh avec forwardD() de RequestDispatcher()

En decorators.xml, je viens de recevoir un décorateur défini:

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

Ce décorateur fonctionne si je vais manuellement http://example.com/my-webapp/jsp/main.jsp. Cependant, il y a quelques endroits où un servlet, au lieu de faire une redirection vers un jsp, fait un forward:

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

Cela signifie que l'URL reste quelque chose comme http://example.com/my-webapp/servlet/MyServlet au lieu du fichier jsp et est donc pas étant décoré, je présume qu'il ne correspond pas au modèle decorators.xml.

Je ne peux pas faire un <pattern>/*</pattern> parce qu'il y a d'autres jsps qui n'ont pas besoin d'être décorés par layout-main.jsp. Je ne peux pas faire un <pattern>/servlet/MyServlet*</pattern> parce que MyServlet peut transmettre à main.jsp parfois et peut-être error.jsp à d'autres moments.

Existe-t-il un moyen de contourner ce problème sans modifications importantes du fonctionnement des servlets? Comme il s'agit d'une application héritée, je n'ai pas autant de liberté pour changer les choses, alors j'espère que quelque chose dans la configuration corrigera cela.

La documentation de SiteMesh n'est vraiment pas géniale. J'ai principalement travaillé sur l'exemple d'application fourni avec la distribution. J'aime beaucoup SiteMesh, et j'espère pouvoir le faire fonctionner dans ce cas.

Répondre

9

Ma compréhension est que SiteMesh est intégré dans l'application en tant que filtre de servlet. Par défaut, les filtres de servlet ne sont invoqués que par rapport à la requête entrante d'origine (dans votre cas, la requête à la servlet). Les requêtes forward ou include suivantes ne sont pas transmises via le filtre et ne seront donc pas transmises via le sitemesh.

Vous pouvez cependant charger le filtre à être invoqué à l'avant, en utilisant quelque chose comme ceci:

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

qui indique le conteneur ne fonctionne que sur les demandes de FORWARD. Les autres options sont INCLUDE et REQUEST, vous pouvez avoir plusieurs éléments. Par conséquent, vous pouvez soit modifier votre configuration de filtre pour spécifier FORWARD, soit modifier le mappage de filtre pour qu'il corresponde au chemin de servlet, plutôt que le chemin JSP. L'un ou l'autre devrait fonctionner.

+1

Cela a fonctionné, en appliquant le filtre à la demande transmise et en appliquant ainsi le décorateur sitemesh à la page jsp transmise. Merci! –

+1

Merci skaffman, c'était juste une aide énorme pour moi! –

+1

J'avais vu ces nouvelles directives mais je n'avais pas encore besoin d'elles. Très bon conseil. –