我有一個servlet,在Dynamic Web App 3.0中針對GlassFish 3.1的一個覆蓋的doGet
方法。在GlassFish 3.1.1下,sendRedirect()不會拋出IllegalStateException和Servlet 3.0.1
我正在學習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
。
*「由於Tomcat 7.0僅支持Servlet 2.5 API」*這是不真實的。 Tomcat 7.0支持Servlet 3.0。也許你對Tomcat 6.0感到困惑?另請參閱http://tomcat.apache.org/whichversion.html – BalusC 2012-02-10 13:55:16
我試圖引用Tomcat 6.0。感謝您的糾正。 – 2012-02-10 20:09:12