sendRedirect()不会在GlassFish 3.1.1下使用Servlet 3.0引发IllegalStateException

sendRedirect()不会在GlassFish 3.1.1下使用Servlet 3.0引发IllegalStateException,exception,servlets,web-applications,glassfish,Exception,Servlets,Web Applications,Glassfish,在面向GlassFish 3.1的动态Web应用程序3.0中,我有一个servlet,其中包含一个重写的doGet方法 我在为考试而学习,试图记住哪些情况会抛出哪些异常 由于Tomcat6.0只支持Servlet2.5API,我不得不使用GlassFish3,我对以下情况感到非常困惑 许多古老的国家: 一旦servlet开始写入,就会提交响应 输出流中的任何内容。如果您尝试在 响应已提交,您将收到一个IllegalStateException错误 然而,Servlet 3.0最终规范第5.3节规

在面向GlassFish 3.1的动态Web应用程序3.0中,我有一个servlet,其中包含一个重写的
doGet
方法

我在为考试而学习,试图记住哪些情况会抛出哪些异常

由于Tomcat6.0只支持Servlet2.5API,我不得不使用GlassFish3,我对以下情况感到非常困惑

许多古老的国家:

一旦servlet开始写入,就会提交响应 输出流中的任何内容。如果您尝试在 响应已提交,您将收到一个IllegalStateException错误

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

如果数据已写入响应缓冲区,但未返回到 客户机(即响应未提交)中的数据 必须清除响应缓冲区,并将其替换为 这些方法。如果响应已提交,则这些方法必须抛出 非法的例外

我想知道的是,考虑到
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容器中抛出一个
非法状态异常

事实是,
PrintWriter.print()
可能会提交响应。如果缓冲区已满或根本没有缓冲,就会发生这种情况。您可以通过调用
ServletResponse.getBufferSize()
来检查其大小

ServletResponse.flushBuffer()
PrintWriter.flush()
肯定会提交响应

因此,如果
PrintWriter.print()
正在提交响应,那么
HttpServletResponse.sendRedirect()
确实会抛出一个
IllegalStateException

另请参见Servlet规范,第5.1节缓冲


顺便说一句,这里没有
RequestDispatcher.dispatch()
;)

谢谢你的详细回答。我最近读了太多的规范,所以我在编方法名。“由于Tomcat7.0只支持Servlet2.5API”,这是不真实的。Tomcat7.0支持Servlet3.0。也许你把Tomcat 6.0弄糊涂了?另请参见,我试图引用Tomcat 6.0。谢谢你的批改。