5

我正在使用 Tomcat 5.5 和 Spring 3.2。在 web.xml 部署描述符中,我有以下配置 -

  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>
  <error-page>
    <error-code>403</error-code>
    <location>/403.jsp</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>

无法解释的行为发生在类似于以下方法的方法中 -

public ModelAndView fileDownload(HttpServletRequest request, 
                                 HttpServletResponse response) throws Exception 
 {
    String filename = (String) request.getParameter("filename");  
    //...more code
    File file = new File(...+ filename); // pseudo code
    OutputStream out = response.getOutputStream();  
    InputStream stream = new FileInputStream(file); // FileNotFoundException here
    //...more code
 }

当发生 FileNotFoundException 时,我看不到用于呈现错误页面的自定义 500.jsp,而是在页面上看到异常的整个堆栈跟踪。如果我只是将两个语句的顺序颠倒如下,

    InputStream stream = new FileInputStream(file); // FileNotFoundException here
    OutputStream out = response.getOutputStream();

一切正常,我在页面上得到了正确的 500.jsp。

为什么会出现这种情况?唯一的区别是在后一种情况下,响应对象的OutputStream 没有打开。

4

3 回答 3

1

在底层,JSP 可能会尝试调用 HttpServletResponse 上的 getWriter 方法。根据规范,可以调用 getWriter 或调用 getOutputStream,但不能同时调用两者。由于您已经调用了 getOutputStream,因此 JSP 无法写入响应。

http://docs.oracle.com/javaee/5/api/javax/servlet/ServletResponse.html#getOutputStream()

http://comments.gmane.org/gmane.comp.jakarta.tomcat.user/182025

于 2013-08-03T05:06:12.500 回答
-1

我认为您需要添加自定义控制器来呈现在web.xml.

@参见此处的描述:使用 Spring 的 Tomcat 中的自定义错误页面

于 2013-07-31T20:23:47.950 回答
-1

这只是一个猜测,但我认为问题与这一点有关,即在发送到客户端之后您不能更改 http 响应(标头)。或更准确地说:见Benjamin Pack的回答

于 2013-07-31T20:49:05.953 回答