web-dev-qa-db-ger.com

Wie kann ich den Trace des Fehlerstapels in der JSP-Seite drucken?

Ich habe meine Fehlerseite in web.xml so eingestellt:

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

Nun möchte ich den Stack-Trace des Fehlers auf JSP drucken (natürlich nur im Entwicklungsmodus). Wie kann ich eine Stack-Trace-Fehlermeldung auf meiner JSP-Seite ausdrucken? Ich verwende keine Frameworks für diese Anwendung, daher sind für mein Programm nur Standard-Servlet-APIs verfügbar.

20
newbie

holen Sie den Parameter aus der Anforderung, die intern festgelegt ist, und verwenden Sie ihn zum Drucken und Bearbeiten anderer Informationen wie cause, message 

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

und Stacktrace drucken

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

Siehe auch

20
Jigar Joshi

Die folgenden Parameter werden vom Container festgelegt, wenn die Anforderung an die Fehlerseite weitergeleitet wird.

  • 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

In deinem Fehler JSP mach das,

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

Oder sonst Wenn Ihre Fehlerseite als Fehlerseite mit Seitenrichtlinie definiert ist,

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

Dieexceptionscripting-Variable wird in der JSP deklariert. Sie können die Skriptvariable mit einem Skriptlet drucken, indem Sie

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

Oder,

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

Die Verwendung von JSP-Scriptlets ist seit einem Jahrzehnt eine verpönte Praxis. Sie sollten es vermeiden .

Wenn Sie bereits mit EL 2.2 oder neuer (Tomcat 7+, JBoss AS 6+, WildFly, GlassFish 3+ usw.) arbeiten und Methodenausdrücke der Form ${instance.method()} jetzt unterstützen, können Sie dies einfach tun Verwenden Sie dazu 100% EL.

Zuerst müssen Sie den JSP-Writer explizit über JspWriter#flush() leeren, damit alle vorhergehenden JSP-Template-Ausgaben tatsächlich in den Writer von geschrieben werden die Servlet-Antwort:

${pageContext.out.flush()}

Dann können Sie einfach ServletResponse#getWriter() an Throwable#printStackTrace() .

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

Vollständiges Beispiel:

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

Wenn Sie bereits mit EL 3.0 arbeiten (Tomcat 8+, WildFly, GlassFish 4+ usw.), können Sie mit dem neuen Semikolon-Operator, der EL-Anweisungen trennt, sogar einen einzelnen Ausdruck erstellen:

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

Wenn Sie isErrorPage="true" Aus irgendeinem Grund nicht verwenden können (und daher das implizite Objekt ${exception} Nicht verfügbar ist), ersetzen Sie es einfach durch ${requestScope['javax.servlet.error.exception']}:

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

Wenn Sie immer noch nicht mit EL 2.2 arbeiten, erstellen Sie am besten eine benutzerdefinierte EL-Funktion. Details finden Sie in Wie kann die Ausnahme von Servlets an eine JSP-Seite weitergeleitet werden?

Unten finden Sie ein vollständigeres Beispiel für eine Fehlerseite mit mehr Details:

<%@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>
13
BalusC

Vielleicht hilft es dir ..
Es wird die Ausnahme StackTrace im Browser angezeigt 

exception.printStackTrace(response.getWriter());  

Oder 

<%
  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!!**
  }
%>

Wenn Sie <% page isErrorPage="true" %> oben in error.jsp deklarieren, haben Sie über ${exception} Zugriff auf die geworfene Exception (und damit auch alle ihre Getter) 

<p>Message: ${exception.message}  

mehr dazu .. Fehler auf Fehlerbildschirmen abbilden

5
Sumit Singh

Oder verwenden Sie jstl, um die Verwendung von Scriptlets in Ihrem jsp zu vermeiden:

<%@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>

Idealerweise sollten Scriptlets als bewährte Methode nicht zugelassen werden. Verhindern Sie explizit Scriplets in Ihren JSP-Dateien über die Konfiguration von 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

Führen Sie auf der Fehlerseite einfach Folgendes aus:

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

Dies wirft zwar die Frage auf: Was macht ein Benutzer mit einer Ausnahme? Warum schreiben Sie die Ausnahme nicht in das Fehlerprotokoll, damit sie dauerhaft bleibt und Sie nach einer Beschwerde durch einen Benutzer zurückgehen können? 

3

Das ausgelagerte Exception-Objekt ist als Anforderungsattribut mit dem Namen 'javax.servlet.error.exception' verfügbar. In Ihrer JSP können Sie also schreiben:

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

Sie können die Jstl-Kernbibliothek verwenden

1) Importieren Sie das Tablib auf die JSP-Datei

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

2) Tag verwenden

<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

Fügen Sie in der Datei error.jsp die folgenden Zeilen hinzu

<%Logger log = Logger.getLogger("error_jsp.class");
Exception e = (Exception)request.getAttribute("javax.servlet.error.exception");
log.debug(request.getAttribute("javax.servlet.error.message"));
e.printStackTrace();
log.debug(e.getStackTrace());%>
0
Ragu14