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.
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
Die folgenden Parameter werden vom Container festgelegt, wenn die Anforderung an die Fehlerseite weitergeleitet wird.
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>
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>
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
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>
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?
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); %>
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/>
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());%>