JSP Error Page产生JSP错误

时间:2011-03-01 23:16:48

标签: jsp jetty custom-error-pages

我的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)

这里似乎发生的事情是以下一系列事件:

  1. Spring控制器遇到未捕获的异常:throw new RuntimeException("no bananas")
  2. 弹出基础MultiActionController捕获此异常(因为没有为此页面定义自定义错误处理程序)重新抛出异常:仅由spring的DispatcherServlet再次捕获。
  3. DispatcherServlet然后查看某些内容(可能是我的web.xml)以发现异常类型的正确错误页面:
  4. Spring然后将此URL解析为视图(和我的错误JSP)并尝试呈现它。
  5. 现在,默认的父jsp(*见下文)出现了问题,抛出一个JSP异常,这次被jetty的ServletHolder捕获。此异常现在(通过web.xml)映射到错误JSP页面。
  6. 在这里你可能会认为这会导致无限循环。但是,第二次解决问题就好了,它会导致JSP错误。
  7. 在渲染默认父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错误都会破坏它。但这不是页面 应该有什么错误吗?

1 个答案:

答案 0 :(得分:2)

  

问:是否可以将JSP作为错误页面,还是应该是静态HTML?

完全没问题。它甚至可以是servlet或其他东西。只要它当然没有错误。

  问:我做错了什么?

您的错误页面有错误。您显然在错误页面中使用<c:import>来包含/WEB-INF中的片段。这是不允许的,因为它不是一个公共资源(老实说,我不记得它会在古代JSTL版本中工作)。而是使用<jsp:include>