2017-04-05 3 views
3

J'utilise les OmniFaces FullAjaxExceptionHandler pour afficher les pages d'erreur. Les pages d'erreur sont affichées correctement, mais j'ai des problèmes avec le style de ces pages.h: corps non créé lors de l'utilisation de FullAjaxExceptionHandler

Mon application utilise un modèle qui a des classes CSS définies sur l'élément body. Ces classes sont différentes pour les pages normales et d'erreur:

page normale:

<h:body styleClass="main-body layout-compact"> 

page d'erreur:

<h:body styleClass="exception-body error-page"> 

Lorsque le FullAjaxExceptionHandler traite une exception, un attaquant à la page d'erreur est effectuée (basé sur le mécanisme <error-page> dans web.xml). Apparemment, cela ne rediffuse pas la balise <h:body>, car lorsque je vérifie la sortie HTML, je peux voir que la balise <body> contient toujours les classes CSS de la page normale (au lieu des classes de la page d'erreur).

Il semble que le contenu de l'original <h:body> est remplacé par le contenu de la page d'erreur <h:body> au lieu de simplement remplacer le plein <h:body>. Je ne sais pas si c'est le comportement JSF/FullAjaxExceptionHandler par défaut.

Existe-t-il un moyen de rendre le <h:body> avec les bonnes classes CSS? Le déplacement des classes CSS de <h:body> n'est pas une option.

+0

Lorsque vous effectuez une redirection vers une page d'erreur, il ne s'agit donc pas d'un appel ajax, vous ne pouvez donc pas faire de rerender. Au lieu de cela, vous chargez une toute nouvelle page d'erreur. S'il vous plaît vérifier si l'avant est fait correctement. Si c'est le cas, vous aurez la bonne CSS appliquée sur l'étiquette du corps. – OTM

+0

L'avant est fait correctement par le FullAjaxExceptionHandler, je ne fais pas un forward par moi-même. La page d'erreur est affichée (sous la même URL) et le contenu entier est modifié. La balise cependant, a toujours les classes CSS de la page précédente. Il semble donc que l'étiquette du corps ne soit pas rendue, mais seulement son contenu. Je ne sais pas si c'est un comportement JSF standard. – baraskae

Répondre

2

Ceci est malheureusement "par conception". JSF ne remplace pas le document entier lors de la navigation ajax, mais il remplace uniquement les enfants des éléments individuels <head> et <body>, laissant les parents intacts. Ceci est fait pour des raisons historiques; les anciennes versions d'Internet Explorer ne prennent pas en charge leur remplacement total.

Ce que j'ai moi-même fait est simplement de mettre le style dans l'élément <main> à la place. Les <header> et <footer> sont généralement identiques dans la sortie HTML finale. En gros:

<html> 
    <head> 
     <title>...</title> 
    </head> 
    <body> 
     <header>...</header> 
     <main class="#{page.type}">...</main> 
     <footer>...</footer> 
    </body> 
</html> 

Si vous avez vraiment besoin d'avoir modifié <body class>, votre meilleur pari est de le faire via JavaScript intégré dans le modèle de page d'erreur.

<h:outputScript rendered="#{faces.ajaxRequest}"> 
    document.body.className = "exception-body error-page"; 
</h:outputScript> 

Note: #{faces} est uniquement disponible depuis OmniFaces 2.5, si vous utilisez une version plus ancienne, utilisez plutôt #{facesContext.partialViewContext.ajaxRequest}).

+1

Merci encore pour la réponse éclairante BalusC! Comme il n'est pas possible d'éloigner le style du corps, dans notre cas, la solution que nous proposons en utilisant le JavaScript intégré fonctionne comme un charme! – baraskae