2012-02-10 26 views
0

我有一個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

+1

*「由於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

+0

我試圖引用Tomcat 6.0。感謝您的糾正。 – 2012-02-10 20:09:12

回答

1

事實是,PrintWriter.print()可能提交響應。如果緩衝區已滿或者根本沒有緩衝,則會發生這種情況。您可以致電ServletResponse.getBufferSize()查詢其大小。

ServletResponse.flushBuffer()PrintWriter.flush()肯定會提交響應。

因此,如果PrintWriter.print()提交了答覆,那麼HttpServletResponse.sendRedirect()確實會拋出IllegalStateException

另請參見Servlet規範,第節5.1緩衝

而順便說一句,沒有RequestDispatcher.dispatch()。 ;)

+0

感謝您的詳細解答。最近我一直在閱讀太多規格,因此我正在編寫方法名稱。現在會修復。 – 2012-02-10 04:03:59

相關問題