Question

J'essaie d'intégrer SiteMesh dans une application héritée utilisant Tomcat 5 comme conteneur. J'ai un main.jsp que je décore avec un simple décorateur.

Dans decorators.xml, je viens de définir un décorateur:

<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 existe quelques endroits où un servlet, au lieu de faire une redirection vers un jsp, effectue 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 n'est donc pas décoré, je présume, car il ne correspond pas au motif de <pattern>/*</pattern>.

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

Existe-t-il un moyen de contourner ce problème sans modifier radicalement le fonctionnement des servlets? Etant donné qu’il s’agit d’une application héritée, je n’ai pas autant de liberté pour changer les choses, j’espère donc que quelque chose au niveau de la configuration permette de résoudre ce problème.

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

Était-ce utile?

La solution

D'après ce que je comprends, SiteMesh est intégré à l'application en tant que filtre 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 adressée à la servlet). Les demandes de transfert ou d’inclusion ultérieures ne sont pas transmises via le filtre et ne seront donc pas transmises via sitemesh.

Vous pouvez toutefois demander que le filtre soit invoqué à l'aide des éléments suivants:

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

Qui indique au conteneur de ne fonctionner que sur les requêtes FORWARD. Les autres options sont INCLUDE et REQUEST, vous pouvez avoir plusieurs éléments.

Par conséquent, vous avez le choix entre modifier votre configuration de filtre pour spécifier FORWARD ou modifier votre mappage de filtre afin qu'il corresponde au chemin d'accès du servlet plutôt qu'au chemin JSP. Soit on devrait travailler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top