我在web.xml中设置了如下错误页面:
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/errors/error.jsp</location>
</error-page>
现在,我想在JSP上打印错误的堆栈跟踪(当然,仅在开发模式下)。如何在JSP页面上打印堆栈错误跟踪?我没有为这个应用程序使用任何框架,所以我的程序只能使用默认的servlet API。
发布于 2015-08-19 14:49:44
使用JSP scriptlet是十年来一直不赞成的做法。你最好是avoid它。
如果你已经在使用EL 2.2或更高版本(Tomcat 7+、JBoss AS 6+、WildFly、GlassFish 3+等),并且对${instance.method()}
形式的方法表达式有新的支持,那么你可以只使用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" %>
...
<pre>${pageContext.out.flush()}${exception.printStackTrace(pageContext.response.writer)}</pre>
如果您已经在使用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>
如果由于某种原因不能使用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>
如果你还没有使用EL 2.2,那么你最好的选择就是创建一个定制的EL函数。详情请访问What is the good approach to forward the exception from servlets to a jsp page?
下面是一个更完整的错误页面示例,其中包含更多详细信息:
<%@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>
https://stackoverflow.com/questions/8135980
复制相似问题