How can I print error stack trace in JSP page?
get the parameter from request that is set internally and use it to print and deal with other information like cause
, message
<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>
and to print stacktrace
<!-- Stack trace -->
<jsp:scriptlet>
exception.printStackTrace(new java.io.PrintWriter(out));
</jsp:scriptlet>
See Also
- JSPIntro4 - Handling Errors
May be it helps to you..
it will be show exception StackTrace into browser
exception.printStackTrace(response.getWriter());
Or
<%
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!!**
}
%>
If you declare <% page isErrorPage="true" %>
in top of error.jsp, then you have access to the thrown Exception (and thus also all of its getters) by ${exception}
<p>Message: ${exception.message}
see more.. Mapping Errors to Error Screens
The following parameters will be set by the container when request is forwarded to the error page.
- 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 your error JSP do this,
<%request.getAttribute("javax.servlet.error.exception").printStackTrace(new java.io.PrintWriter(out))%>;
Or Else If your error page is defined as Error page with Page Directive like,
<%@ page isErrorPage="true" import="java.io.*"%>
The exception scripting variable will be declared in the JSP. You can printing the scripting variable using a scriptlet using,
exception.printStackTrace(new java.io.PrintWriter(out));
Or,
<jsp:scriptlet>
exception.printStackTrace(response.getWriter())
</jsp:scriptlet>
Using JSP scriptlets is a frowned upon practice since a decade. You'd best avoid it.
If you're already on EL 2.2 or newer (Tomcat 7+, JBoss AS 6+, WildFly, GlassFish 3+, etc), with new support for method expressions of the form ${instance.method()}
, then you can just use 100% EL for this.
First you need to explicitly flush the JSP writer via JspWriter#flush()
, so that all preceding JSP template output really gets written to the writer of the servlet response:
${pageContext.out.flush()}
Then you can just pass ServletResponse#getWriter()
to Throwable#printStackTrace()
.
${exception.printStackTrace(pageContext.response.writer)}
Complete example:
<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>
If you're already on EL 3.0 (Tomcat 8+, WildFly, GlassFish 4+, etc), you can even make it a single expression with the new semicolon operator which separates EL statements:
<%@page pageEncoding="UTF-8" isErrorPage="true" %>
...
<pre>${pageContext.out.flush();exception.printStackTrace(pageContext.response.writer)}</pre>
If you can't use isErrorPage="true"
for some reason (and thus ${exception}
implicit object isn't available), then just substitute with ${requestScope['javax.servlet.error.exception']}
:
<%@page pageEncoding="UTF-8" %>
...
<pre>${pageContext.out.flush()}${requestScope['javax.servlet.error.exception'].printStackTrace(pageContext.response.writer)}</pre>
If you're still not on EL 2.2, then your best bet is creating a custom EL function. Detail can be found in What is the good approach to forward the exception from servlets to a jsp page?
Below is a more complete error page example with more detail:
<%@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>