2011-03-01 64 views
2

我的春天MVC Web应用程序有它一个可折叠的堆栈跟踪元素(显然是一个开发/调试选项)一个错误页面。这用于正常工作,并从控制器(或有时来自JSP引擎)显示适当的堆栈跟踪。JSP错误页面产生一个JSP错误

Q:是否有可能有一个JSP是一个错误页面,或者它应该是静态的HTML?

Q:我在做什么错?

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

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

沿途某处(切换到Maven构建系统,升级的码头,和春季2.5 - > 3.0),我注意到这个错误页面停止了以前的工作方式。它renderes一个问题是相同的 - 异常堆栈轨迹显示是从控制器抛出的异常,但是从错误页面本身!

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. 春季控制器点击未捕获的异常:throw new RuntimeException("no bananas")
  2. 此异常由弹簧底座的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错误会打破它。但是,这不是什么错误页应该有什么?

回答

2

问:是否有可能让JSP成为错误页面,还是应该是静态HTML?

这是完全正常的。它甚至可以是一个servlet或其他东西。只要它没有错误当然。

问:我在做什么错?

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

+0

哇,它惊人的你能够从我的帖子中得知它。这正是我正在做的。 – Justin 2011-03-02 00:43:28

+0

这完全解决了它,所有页面的默认父项不必要地使用了。我仍然不明白为什么从错误页面的错误显示正确..因为,它也使用默认的父母。 – Justin 2011-03-02 03:21:22

+0

不客气。 – BalusC 2011-03-02 03:21:47