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

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

 java.lang.Exception /errors/error.jsp  

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

从内部设置的请求中获取参数,并使用它来打印和处理causemessage等其他信息

  

并打印stacktrace

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

也可以看看

  • JSPIntro4 – 处理错误

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

  • 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)); 

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

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

exception脚本变量将在JSP中声明。 您可以使用scriptlet打印脚本变量,

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

要么,

  exception.printStackTrace(response.getWriter())  

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

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

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

 ${pageContext.out.flush()} 

然后你可以将ServletResponse#getWriter()传递给Throwable#printStackTrace()

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

完整的例子:

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

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

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

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

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

如果您还没有使用EL 2.2,那么您最好的选择是创建自定义ELfunction。 详细信息可以找到将exception从servlet转发到jsp页面的好方法是什么?

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

 <%@page pageEncoding="UTF-8" isErrorPage="true" %> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ... 
  • Exception:
  • Exception type:
  • Exception message:
  • Request URI:
  • Servlet name:
  • Status code:
  • Stack trace:
    ${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}

可能对你有帮助..
它会将StackTraceexception显示在浏览器中

 exception.printStackTrace(response.getWriter()); 

要么

 <% try{ int test = Integer.parseInt("hola"); }catch(Exception e){ **// HERE THE MAGIC BEGINS!!** out.println("
"); e.printStackTrace(new java.io.PrintWriter(out)); out.println("
"); **// THE MAGIC ENDS!!** } %>

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

 

Message: ${exception.message}

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

在错误页面上,只需执行以下操作:

  exception.printStackTrace(response.getWriter())  

虽然这引出了一个问题:用户将如何处理exception。 为什么不将错误写入错误日志,以便它保持不变,你可以在用户抱怨之后回复它?

或者,为了避免在jsp中使用scriptlet,请使用jstl:

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

${exception}


理想情况下,应该禁止使用scriptlet作为最佳实践。 通过web.xml配置明确防止jsp文件中的scriplet:

   *.jsp true   

Thrown Exception对象可用作名为’javax.servlet.error.exception’的请求属性。 所以,在你的JSP中,你可以写:

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

您可以使用jstl核心库

1)在JSP文件的顶部导入tablib

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

2)使用标签

  Code that might throw Exception   There was an exception: ${myExceptionObject.message}