Sitemesh : décoration d’une page d’erreur

Sitemesh : décoration d’une page d’erreur

Bonjour,

Il y a quelques temps, j’ai écrit un article introductif à Sitemesh que l’on peut trouver ici: Sitemesh : gérer son layout sans douleur.

Un bug a été trouvé dans Sitemesh, normalement corrigé dans la version 2.4 dont la date de sortie n’a pas encore été annoncée, je vais vous donner ici trois workaround possibles.

Le problème: impossible de décorer une page d’erreur avec Sitemesh.
Ticket JIRA: http://jira.opensymphony.com/browse/SIM-168

Solution 1:

Sous Tomcat uniquement, mettre les paramètres suivant (init-param) pour le filtre Sitemesh dans votre web.xml:

<filter-mapping>
      <filter-name>sitemesh</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
      <dispatcher>ERROR</dispatcher>
</filter-mapping>

Solution 2:

Le bug se situant au niveau du filtre Sitemesh qui met le paramètre ‘decoration done’ dans la requête avant de passer dans la chaîne de filtre qui génère l’erreur (pour ceux qui ne comprennent pas, c’est pas grâve 🙂 ). Il faut étendre le filtre Sitemesh en gérant les erreurs comme ceci:

public class ErrorHandlingSiteMeshPageFilter extends PageFilter {

    public void doFilter(ServletRequest request, ServletResponse rs, FilterChain chain)
		throws IOException, ServletException {
        try {
            super.doFilter(request, rs, chain);
        } catch (RuntimeException e) {
            clearFilteredVariable(request);
            throw e;
        } catch(IOException e) {
            clearFilteredVariable(request);
            throw e;
        } catch(ServletException e) {
            clearFilteredVariable(request);
            throw e;
        }
    }

    private void clearFilteredVariable(ServletRequest request) {
        request.setAttribute(FILTER_APPLIED, null);
    }
}

Solution 3:

Si aucune de celle ci-dessus marchent ou ne sont possible chez vous, il suffit de décorer manuellement votre page d’erreur, dans le cas où c’est une JSP. Ce qui peut être fait simplement comme ça:

<g:applyLayout name="main">
 // votre page d'erreur ici
</g:applyLayout>

2 thoughts on “Sitemesh : décoration d’une page d’erreur

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.