web-dev-qa-db-fra.com

Comment imprimer une trace de pile d'erreur dans une page JSP?

J'ai défini ma page d'erreur comme ceci dans web.xml:

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

Maintenant, j'aimerais imprimer une trace d'erreur de pile sur JSP (bien sûr en mode de développement uniquement). Comment puis-je imprimer une trace d'erreur de pile sur ma page JSP? Je n'utilise aucun framework pour cette application, donc seules les API de servlet par défaut sont disponibles pour mon programme.

20
newbie

récupère le paramètre de la requête définie en interne et l'utilise pour imprimer et traiter d'autres informations telles que cause, message 

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>

et imprimer stacktrace

<!-- Stack trace -->
<jsp:scriptlet>
  exception.printStackTrace(new Java.io.PrintWriter(out));
</jsp:scriptlet>

Voir également

20
Jigar Joshi

Les paramètres suivants seront définis par le conteneur lorsque la demande est transmise à la page d'erreur.

  • javax.servlet.error.status_code
  • javax.servlet.error.exception
  • javax.servlet.error.message
  • javax.servlet.error.request_uri
  • javax.servlet.error.servlet_name
  • javax.servlet.error.exception_type

Dans votre erreur JSP fais cela,

<%request.getAttribute("javax.servlet.error.exception").printStackTrace(new Java.io.PrintWriter(out))%>;

Ou sinon Si votre page d'erreur est définie comme page d'erreur avec directive de page comme,

<%@ page isErrorPage="true" import="Java.io.*"%>

La variableexceptionscripting sera déclarée dans le JSP. Vous pouvez imprimer la variable de script à l'aide d'un scriptlet en utilisant,

exception.printStackTrace(new Java.io.PrintWriter(out));

Ou,

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>
21
Ramesh PVK

L'utilisation de scripts JSP est une pratique mal vue depuis une décennie. Vous feriez mieux éviter cela.

Si vous êtes déjà sous EL 2.2 ou plus récent (Tomcat 7+, JBoss AS 6+, WildFly, GlassFish 3+, etc.), avec un nouveau support pour les expressions de méthode de la forme ${instance.method()}, vous pouvez simplement utiliser 100% EL pour cela. . 

Vous devez d’abord vider explicitement l’écrivain JSP via JspWriter#flush() , de sorte que toutes les sorties de modèle JSP précédentes soient réellement écrites sur l’écrivain de la réponse du servlet:

${pageContext.out.flush()}

Ensuite, vous pouvez simplement passer ServletResponse#getWriter() à Throwable#printStackTrace() .

${exception.printStackTrace(pageContext.response.writer)}

Exemple complet:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>

Si vous êtes déjà sur EL 3.0 (Tomcat 8+, WildFly, GlassFish 4+, etc.), vous pouvez même en faire une expression unique avec le nouvel opérateur de point-virgule qui sépare les instructions EL:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush();exception.printStackTrace(pageContext.response.writer)}</pre>

Si vous ne pouvez pas utiliser isErrorPage="true" pour quelque raison que ce soit (et donc que l'objet implicite ${exception} n'est pas disponible), remplacez simplement par ${requestScope['javax.servlet.error.exception']}:

<%@page pageEncoding="UTF-8" %>
...
<pre>${pageContext.out.flush()}${requestScope['javax.servlet.error.exception'].printStackTrace(pageContext.response.writer)}</pre>

Si vous n'êtes toujours pas sur EL 2.2, votre meilleur choix est de créer une fonction EL personnalisée. Vous pouvez trouver des détails dans Quelle est la bonne approche pour transférer l’exception des servlets vers une page jsp?

Vous trouverez ci-dessous un exemple de page d'erreur plus complet et plus détaillé:

<%@page pageEncoding="UTF-8" isErrorPage="true" %>
<%@taglib uri="http://Java.Sun.com/jsp/jstl/core" prefix="c" %>
...
<ul>
    <li>Exception: <c:out value="${requestScope['javax.servlet.error.exception']}" /></li>
    <li>Exception type: <c:out value="${requestScope['javax.servlet.error.exception_type']}" /></li>
    <li>Exception message: <c:out value="${requestScope['javax.servlet.error.message']}" /></li>
    <li>Request URI: <c:out value="${requestScope['javax.servlet.error.request_uri']}" /></li>
    <li>Servlet name: <c:out value="${requestScope['javax.servlet.error.servlet_name']}" /></li>
    <li>Status code: <c:out value="${requestScope['javax.servlet.error.status_code']}" /></li>
    <li>Stack trace: <pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre></li>
</ul>
10
BalusC

Peut-être que cela vous aide ..
il sera montrer exception StackTrace dans le navigateur 

exception.printStackTrace(response.getWriter());  

Ou 

<%
  try{
     int test = Integer.parseInt("hola");
  }catch(Exception e){
     **// HERE THE MAGIC BEGINS!!**
     out.println("<div id=\"error\">");
     e.printStackTrace(new Java.io.PrintWriter(out));
    out.println("</div>");
    **// THE MAGIC ENDS!!**
  }
%>

Si vous déclarez <% page isErrorPage="true" %> en haut de error.jsp, vous avez alors accès à l'exception levée (et donc à tous ses getters) par ${exception} 

<p>Message: ${exception.message}  

voir plus .. Mappage des erreurs sur les écrans d'erreur

5
Sumit Singh

Ou, pour éviter d'utiliser des scriptlets dans votre jsp, utilisez jstl:

<%@taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core"%>
...

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>

<c:if test="${exception != null}">
  <h4>${exception}</h4>
  <c:forEach var="stackTraceElem" items="${exception.stackTrace}">
    <c:out value="${stackTraceElem}"/><br/>
  </c:forEach>
</c:if>

Idéalement, les scriptlets devraient être interdits en tant que meilleure pratique. Empêcher explicitement les scriplets dans vos fichiers jsp via la configuration web.xml:

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
3
Brice Roncace

Sur la page d'erreur, faites juste:

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>

Bien que cela pose la question: qu'est-ce qu'un utilisateur va faire avec une exception. Pourquoi ne pas écrire l'exception dans le journal des erreurs afin qu'il soit conservé et que vous puissiez y revenir après qu'un utilisateur se soit plaint? 

3

L'objet Exception levée est disponible en tant qu'attribut de demande portant le nom 'javax.servlet.error.exception'. Ainsi, dans votre JSP, vous pouvez écrire:

<% request.getAttribute("javax.servlet.error.exception").printStackTrace(new Java.io.PrintWriter(out); %>
2
socha23

Vous pouvez utiliser la bibliothèque de base jstl

1) Importer une table au dessus du fichier JSP

<%@ taglib prefi x=”c” uri=”http://Java.Sun.com/jsp/jstl/core” %>

2) utiliser la balise

<c:catch var="myExceptionObject">
    Code that might throw Exception
<c:catch/>

<c:if test="${myExceptionObject} != null">
    There was an exception: ${myExceptionObject.message}
<c:if/>
0
Chirag Visavadiya