2008-10-16 5 views
3

J'ai défini une page d'erreur dans mon web.xml:JSP: Comment puis-je continuer à exécuter le code sur ma page d'erreur, même si je ne peux pas l'afficher?

<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/error.jsp</location> 
</error-page> 

Dans cette page d'erreur, j'ai une balise personnalisée que j'ai créé. Le gestionnaire de balises de cette balise me fait parvenir par e-mail la pile de toutes les erreurs survenues. Pour la plupart, cela fonctionne très bien.

Lorsque cela ne fonctionne pas, c'est que la sortie a déjà commencé à être envoyée au client au moment où l'erreur se produit. Dans ce cas, nous obtenons ceci:

SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp] 
java.lang.IllegalStateException 

Je crois que cette erreur se produit parce que nous ne pouvons pas rediriger une requête vers la page d'erreur après la sortie a déjà commencé. La solution de contournement que j'ai utilisée est d'augmenter la taille de la mémoire tampon sur des pages JSP particulièrement volumineuses. Mais j'essaie d'écrire un gestionnaire d'erreur générique que je peux appliquer aux applications existantes, et je ne suis pas sûr qu'il soit possible de parcourir des centaines de pages JSP en s'assurant que leurs tampons sont assez grands.

Existe-t-il un moyen d'autoriser l'exécution de mon code de courrier électronique de pile dans ce cas, même si je ne peux pas afficher la page d'erreur sur le client?

+0

Avez-vous déjà trouvé une solution? –

+0

Trier par. Ma solution était d'abandonner JSP et d'utiliser Spring MVC. ;-) –

Répondre

1

Avez-vous essayé d'utiliser la directive <% @ page errorPage = "/ myerrorpage.jsp"%>?

Vous devez également utiliser <% page isErrorPage = "true" $> dans myerrorpage.jsp, puis.

Je pense que cela pourrait résoudre votre problème. Le seul problème avec cela est que vous devez l'inclure dans chaque JSP en quelque sorte.

+0

Je pourrais essayer cela, bien que je ne sois pas convaincu qu'il y ait une différence entre l'attribut errorPage = "x" et le mettre dans le fichier web.xml, sauf que l'un est spécifique à la page et l'autre à l'application. –

+0

Vous pourriez essayer sur une page juste pour voir si cela * pourrait * fonctionner. –

2

La page errorPage ne sera pas utilisée si vous avez déjà commencé à envoyer des données au client. Ce que je fais est d'utiliser un rappel JavaScript pour vérifier une page incomplète, puis rediriger vers la page d'erreur. Au début de votre page dans un en-tête includes ou quelque chose, initialisez une variable boolean javascript à false et enregistrez un gestionnaire onload pour vérifier l'état et rediriger vers une page d'erreur.

<script type="text/javascript"> 
     var pageLoadSuccessful = false;//set to true in footer.jsp 
     dojo.addOnLoad(function(){ 
      if (!pageLoadSuccessful) window.location = "<c:url value="/error.do" />"; 
     }); 
</script> 

Puis, dans un pied de page jsp, assurez-vous de définir cette variable à true: En fait,

<script type="text/javascript"> 
    pageLoadSuccessful = true;//declared in header.jsp 
</script> 
+0

Vous souhaitez probablement utiliser window.location.replace ("") pour que le bouton de retour fonctionne toujours. –

1

ce problème particulier indique que vous utilisiez scriptlets dans JSP. Ceci est un bad practice et ce problème particulier est l'une des principales raisons pour cela. Vous devez déplacer toute votre logique métier vers une classe Java réelle afin de vous retrouver avec seulement taglibs/EL dans JSP. Dans un servlet/filtre, vous pouvez parfaitement gérer les exceptions avant de transmettre la requête à un JSP.

+0

Ummm, non. Un gestionnaire de balises peut générer une exception et provoquer ce problème. En fait, je crois que c'était le cas ici, mais cela fait plus d'un an et, honnêtement, je ne m'en souviens plus. –

+0

Cela doit alors être considéré comme un défaut/bug dans le code du gestionnaire d'étiquette. – BalusC

Questions connexes