How can I print error stack trace in JSP page?

后端 未结 9 2016
说谎
说谎 2020-12-01 17:50

I have set my error page like this in web.xml:

 
  java.lang.Exception
  /erro         


        
相关标签:
9条回答
  • 2020-12-01 18:31

    On the error page, just do:

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

    Although this begs the question: what is a user going to do with an exception. Why not write the exception to the error log so it is persisted and you can go back to it after a user complains?

    0 讨论(0)
  • 2020-12-01 18:34

    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
    0 讨论(0)
  • 2020-12-01 18:34

    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

    0 讨论(0)
  • 2020-12-01 18:35

    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>
    
    0 讨论(0)
  • 2020-12-01 18:41

    You can use jstl core library

    1) Import tablib on top of JSP file

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

    2) use tag

    <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 讨论(0)
  • 2020-12-01 18:44

    In the error.jsp add the below lines

    <%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 讨论(0)
提交回复
热议问题