【问题标题】:JSP Error Page produces a JSP errorJSP 错误页面产生 JSP 错误
【发布时间】:2011-03-01 23:16:47
【问题描述】:

我的 spring-mvc Web 应用程序有一个错误页面,其中包含一个可折叠的堆栈跟踪元素(显然是一个开发/调试选项)。这过去工作得很好,并显示了来自控制器(或有时来自 JSP 引擎)的正确堆栈跟踪。

Q:JSP 是否可以是错误页面,还是应该是静态 HTML?

:我做错了什么?

事件链(我认为)由我的 web.xml 中定义的错误处理程序驱动:

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/view/errors/internalError.jsp</location>
</error-page>

在此过程中(切换到 maven 构建系统、升级码头和 spring 2.5 -> 3.0),我注意到这个错误页面停止工作。它呈现相同的一个问题 - 显示的异常堆栈跟踪不是来自控制器中抛出的异常,而是来自错误页面本身!

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. 这个异常被springs base MultiActionController 捕获(因为没有为此页面定义自定义错误处理程序)异常被重新抛出:只会被spring 的DispatcherServlet 再次捕获。
  3. 然后 DispatcherServlet 会查看某些内容(可能是我的 web.xml)以发现异常类型的正确错误页面:
  4. Spring 然后将此 URL 解析为视图(以及我的错误 JSP)并尝试呈现它。
  5. 现在默认父 jsp 出现问题(* 见下文),引发 JSP 异常,这一次被码头的 ServletHolder 捕获。此异常现在(通过 web.xml)映射到错误 JSP 页面。
  6. 在这里您可能会认为这会导致无限循环。但是,第二次解决问题就很好了,它呈现了 JSP 错误。

在渲染默认的父 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 错误都会破坏它。但这不是页面应该有什么错误吗?

【问题讨论】:

    标签: jsp jetty custom-error-pages


    【解决方案1】:

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

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

    问:我做错了什么?

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

    【讨论】:

    • 哇,你能从我的帖子中猜到这一点真是太棒了。这正是我正在做的。
    • 这完全修复了它,所有页面的默认父级都不必要地使用了 。我仍然不明白为什么错误页面中的错误显示正确..因为它也使用默认父级。
    猜你喜欢
    • 2012-05-06
    • 2016-03-02
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 2017-10-06
    • 2015-07-10
    • 2014-06-21
    相关资源
    最近更新 更多