我在一个针对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
答案 0 :(得分:1)
事实是PrintWriter.print()
可以提交回复。如果缓冲区已满或者根本没有缓冲,则会发生这种情况。您可以致电ServletResponse.getBufferSize()
来查看其尺寸。
ServletResponse.flushBuffer()
或PrintWriter.flush()
肯定会提交回复。
因此,如果PrintWriter.print()
提交了回复,则HttpServletResponse.sendRedirect()
确实会投放IllegalStateException
。
另请参阅Servlet规范, 5.1缓冲部分。
顺便说一下,没有RequestDispatcher.dispatch()
。 ;)