JSP错误页面生成一个JSP错误

JSP错误页面生成一个JSP错误,jsp,jetty,custom-error-pages,Jsp,Jetty,Custom Error Pages,我的SpringMVCWeb应用程序有一个错误页面,其中有一个可折叠的堆栈跟踪元素(显然是一个开发/调试选项)。这过去工作得很好,并且显示了来自控制器(有时来自JSP引擎)的正确堆栈跟踪 Q:JSP可能是错误页面,还是应该是静态HTML Q:我做错了什么 事件链(我认为)是由my web.xml中定义的错误处理程序驱动的: <error-page> <exception-type>java.lang.Throwable</exception-type>

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

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

Q:我做错了什么

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

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/view/errors/internalError.jsp</location>
</error-page>
这里似乎发生了以下一连串事件:

  • Spring控制器遇到未捕获的异常:
    抛出新的RuntimeException(“无香蕉”)
  • springs base MultiActionController捕获此异常(因为没有为此页定义自定义错误处理程序)。该异常被重新抛出:只会被spring的DispatcherServlet再次捕获
  • DispatcherServlet然后查看某些内容(可能是my web.xml)以发现异常类型的正确错误页面:
  • Spring然后将这个URL解析为一个视图(以及我的错误JSP),并尝试呈现它
  • 现在,默认父jsp(*见下文)出现问题,抛出一个jsp异常,这次被jetty的ServletHolder捕获。此异常现在映射(通过web.xml)到错误JSP页面
  • 在这里,您可能会认为这将导致一个无限循环。然而,第二次处理的结果很好,它呈现了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));
    }
    
    //根据JSTL规范不允许不适当的响应代码
    if(irw.getStatus()<200 | | irw.getStatus()>299){
    抛出新的JSPTageException(irw.getStatus()+“”+stripSession(targetUrl));
    }
    
    尽管在这里看起来任何HTTP 500错误都会破坏它。但这不是页面应该出现的错误吗

    问:JSP可能是一个错误页面,还是应该是静态HTML

    很好。它甚至可以是一个servlet或其他东西。当然,只要它没有bug

    问:我做错了什么


    您的错误页面有一个错误。显然,您在错误页面中使用了
    ,以包含
    /WEB-INF
    中的一个片段。这是不允许的,因为它不是公共资源(老实说,我不记得它在古老的JSTL版本中会起作用)。相反,使用

    哇,你能从我的帖子中猜到这一点真是太神奇了。这正是我正在做的。这完全修复了它,所有页面的默认父级都在不必要地使用。我仍然不明白为什么错误页面中的错误显示正确。。因为,它也使用默认的父对象。
    // disallow inappropriate response codes per JSTL spec
    if (irw.getStatus() < 200 || irw.getStatus() > 299) {
      throw new JspTagException(irw.getStatus() + " " + stripSession(targetUrl));
    }