如何在JSP页面中打印错误堆栈跟踪?

new*_*bie 22 java jsp servlets jstl exception

我在web.xml中设置了这样的错误页面:

 <error-page>
  <exception-type>java.lang.Exception</exception-type>
  <location>/errors/error.jsp</location>
 </error-page>
Run Code Online (Sandbox Code Playgroud)

现在我想在JSP上打印堆栈跟踪错误(当然只在开发模式下).如何在JSP页面上打印堆栈错误?我没有为此应用程序使用任何框架,因此只有默认的servlet API可用于我的程序.

Ram*_*PVK 21

当请求转发到错误页面时,容器将设置以下参数.

  • 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

在您的错误JSP中执行此操作,

<%request.getAttribute("javax.servlet.error.exception").printStackTrace(new java.io.PrintWriter(out))%>;
Run Code Online (Sandbox Code Playgroud)

或者否则如果您的错误页面被定义为带有Page Directive的错误页面,

<%@ page isErrorPage="true" import="java.io.*"%>
Run Code Online (Sandbox Code Playgroud)

该例外脚本变量将在JSP中声明.您可以使用scriptlet打印脚本变量,

exception.printStackTrace(new java.io.PrintWriter(out));
Run Code Online (Sandbox Code Playgroud)

要么,

<jsp:scriptlet>
    exception.printStackTrace(response.getWriter())
</jsp:scriptlet>
Run Code Online (Sandbox Code Playgroud)


Jig*_*shi 20

得到请求在内部设置的参数,并使用它来打印和处理其他信息一样cause,message

<c:set var="exception" value="${requestScope['javax.servlet.error.exception']}"/>
Run Code Online (Sandbox Code Playgroud)

并打印堆栈跟踪

<!-- Stack trace -->
<jsp:scriptlet>
  exception.printStackTrace(new java.io.PrintWriter(out));
</jsp:scriptlet>
Run Code Online (Sandbox Code Playgroud)

也可以看看


Bal*_*usC 13

使用JSP scriptlet是十年来不受欢迎的做法.你最好避免它.

如果您已经使用EL 2.2或更新版本(Tomcat 7 +,JBoss AS 6 +,WildFly,GlassFish 3+等),并且对表单的方法表达式有新的支持${instance.method()},那么您可以使用100%EL.

首先,您需要显式刷新JSP JspWriter#flush()编写器,以便所有前面的JSP模板输出真正写入servlet响应的编写器:

${pageContext.out.flush()}
Run Code Online (Sandbox Code Playgroud)

那你就可以ServletResponse#getWriter()转到Throwable#printStackTrace().

${exception.printStackTrace(pageContext.response.writer)}
Run Code Online (Sandbox Code Playgroud)

完整的例子:

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

如果您已经使用EL 3.0(Tomcat 8 +,WildFly,GlassFish 4+等),您甚至可以使用分隔EL语句的新分号运算符使其成为单个表达式:

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

如果isErrorPage="true"由于某种原因无法使用(因此${exception}隐式对象不可用),那么只需替换为${requestScope['javax.servlet.error.exception']}:

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

如果您还没有使用EL 2.2,那么最好的办法是创建自定义EL功能.详细信息可以找到将异常从servlet转发到jsp页面的好方法是什么?

以下是更完整的错误页面示例,其中包含更多详细信息

<%@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>
Run Code Online (Sandbox Code Playgroud)


Sum*_*ngh 5

可能对你有帮助..
它会在浏览器中显示异常StackTrace

exception.printStackTrace(response.getWriter());  
Run Code Online (Sandbox Code Playgroud)

要么

<%
  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!!**
  }
%>
Run Code Online (Sandbox Code Playgroud)

如果你<% page isErrorPage="true" %>在error.jsp之上声明,那么你可以通过以下方式访问抛出的异常(以及它的所有getter)${exception}

<p>Message: ${exception.message}  
Run Code Online (Sandbox Code Playgroud)

看到更多.. 将错误映射到错误屏幕