我的spring-mvc Web应用程序有一个错误页面,其中包含一个可折叠的堆栈跟踪元素(显然是一个开发/调试选项)。这曾经很好地工作,并从控制器(或有时从JSP引擎)显示正确的堆栈跟踪。
问:是否可以将JSP作为错误页面,还是应该是静态HTML?
问:我做错了什么?
事件链是(我认为)由我的web.xml中定义的错误处理程序驱动:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/view/errors/internalError.jsp</location>
</error-page>
沿途的某个地方(切换到maven构建系统,升级后的jetty,以及spring 2.5 - > 3.0),我注意到这个错误页面已经停止了工作。它在一个问题中呈现相同的效果 - 显示的异常堆栈跟踪是 NOT 来自控制器中抛出的异常,但来自错误页面本身!
javax.servlet.ServletException: javax.servlet.jsp.JspTagException:
500 /WEB-INF/jsp/admin/errors/internalError.jsp
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
at org.apache.jsp.WEB_002dINF.jsp.admin.defaultParent_jsp._jspService(defaultParent_jsp.java:225)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
这里似乎发生的事情是以下一系列事件:
throw new RuntimeException("no bananas")
在渲染默认父JSP时,JSP引擎似乎已经死亡 - 它似乎在:org.apache.taglibs.standard.tag.common.core.ImportSupport
中遇到了麻烦。我看过一些网络帖子,人们说它与WEB-INF目录中的导入有关。
// disallow inappropriate response codes per JSTL spec
if (irw.getStatus() < 200 || irw.getStatus() > 299) {
throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
}
虽然它看起来像任何HTTP 500错误都会破坏它。但这不是页面 应该有什么错误吗?
答案 0 :(得分:2)
问:是否可以将JSP作为错误页面,还是应该是静态HTML?
完全没问题。它甚至可以是servlet或其他东西。只要它当然没有错误。
问:我做错了什么?
您的错误页面有错误。您显然在错误页面中使用<c:import>
来包含/WEB-INF
中的片段。这是不允许的,因为它不是一个公共资源(老实说,我不记得它会在古代JSTL版本中工作)。而是使用<jsp:include>
。