sendRedirect()不会在GlassFish 3.1.1下使用Servlet 3.0抛出IllegalStateException

时间:2012-02-10 00:26:08

标签: exception servlets web-applications glassfish

我在一个针对GlassFish 3.1的Dynamic Web App 3.0中有一个覆盖了doGet方法的servlet。

我正在攻读OCEJWCD考试并试图记住哪些情况会引发哪些例外。

由于Tomcat 6.0仅支持Servlet 2.5 API,我必须使用Glassfish 3,我对以下情况非常困惑。

许多旧sources声明:

  

一旦servlet开始写入,就会提交响应   输出流的任何内容。如果你试图重新指导后   响应已提交,您将收到IllegalStateException错误。

然而,Servlet 3.0最终规范第5.3节规定:

  

如果数据已写入响应缓冲区,但未返回   客户端(即响应未提交),数据在   必须清除响应缓冲区并替换为设置的数据   这些方法。如果响应已提交,则必须抛出这些方法   一个IllegalStateException

我想知道的是,考虑到PrintWriter.print() 提交响应,为什么这些行不会抛出IllegalStateException

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String url = "http://someurl.com/";
    PrintWriter out = response.getWriter();
    out.print("This will be written into response buffer");
    response.sendRedirect(url); // sendRedirect() after writing into buffer
}

我必须注意,我能够从GlassFish服务器日志中获取异常,我可以清楚地看到HttpServletRequest.getRequestDispatcher().forward(req,res);后跟HttpServletResponse.sendRedirect(url);确实在GlassFish容器中抛出IllegalStateException

1 个答案:

答案 0 :(得分:1)

事实是PrintWriter.print() 可以提交回复。如果缓冲区已满或者根本没有缓冲,则会发生这种情况。您可以致电ServletResponse.getBufferSize()来查看其尺寸。

ServletResponse.flushBuffer()PrintWriter.flush() 肯定会提交回复。

因此,如果PrintWriter.print()提交了回复,则HttpServletResponse.sendRedirect()确实会投放IllegalStateException

另请参阅Servlet规范, 5.1缓冲部分。

顺便说一下,没有RequestDispatcher.dispatch()。 ;)