摘自:http://blog.csdn.net/quechao123/article/details/6256653
http://jorton468.blog.163.com/blog/static/72588135201102441617287/
異常一:java.lang.IllegalStateException:Cannot?? forward?? a?? response?? that?? is?? already?? committed
異常二:IllegalStateException:response already commited
異常三:IllegalStateException:getOutputStream() has already been called for this request
前言:
response是服務(wù)端對(duì)客戶端請求的一個(gè)響應(yīng),其中封裝了響應(yīng)頭、狀態(tài)碼、內(nèi)容(也就是最終要在瀏覽器上顯示的HTML代碼或者其他數(shù)據(jù)格式)等,
服務(wù)端在把response提交到客戶端之前,會(huì)使用一個(gè)緩沖區(qū),并向該緩沖區(qū)內(nèi)寫入響應(yīng)頭和狀態(tài)碼,然后將所有內(nèi)容flush(flush包含兩個(gè)步驟:先將緩沖區(qū)內(nèi)容發(fā)送至客戶端,然后將緩沖區(qū)清空)。這就標(biāo)志著該次響應(yīng)已經(jīng)committed(提交)。對(duì)于當(dāng)前頁面中已經(jīng)committed(提交)的response,就不能再使用這個(gè)response向緩沖區(qū)寫任何東西(注:以為JSP中,response是一個(gè)JSP頁面的內(nèi)置對(duì)象,所以同一個(gè)頁面中的response.XXX()是同一個(gè)response的不同方法,只要其中一個(gè)已經(jīng)導(dǎo)致了committed,那么其它類似方式的調(diào)用都會(huì)導(dǎo)致 IllegalStateException異常)。
對(duì)于異常一:
問題描述:
在執(zhí)行一段代碼后,最后執(zhí)行request.getRequestDispatcher(跳轉(zhuǎn)頁面URL).forward(resquest,response)進(jìn)行頁面跳轉(zhuǎn)時(shí),報(bào)了此錯(cuò)
問題原因:
1.在forwar之前,response就已經(jīng)commit到瀏覽器端了。
導(dǎo)致response commit的原因包括:forward, redirect, flushBuffer
2.前兩個(gè)原因都是指在forward之前就已經(jīng)進(jìn)行了頁面跳轉(zhuǎn)動(dòng)作(forward, redirect)。
至于flushBuffer,每一個(gè)JSP頁面都有一個(gè)緩沖區(qū),默認(rèn)的緩沖區(qū)大小為8KB,如果緩沖區(qū)被占滿的話,web服務(wù)器就會(huì)自動(dòng)將response 進(jìn)行commit,然后清空緩沖區(qū)(即flush),所以再進(jìn)行頁面跳轉(zhuǎn)的時(shí)候就會(huì)報(bào)response已經(jīng)被commit了。
內(nèi)置對(duì)象out相關(guān)方法
public abstract voidclear() throws java.io.IOException清除緩沖區(qū)中的內(nèi)容。如果緩沖區(qū)已經(jīng)被刷新,clear()方法將拋出IOException異常
public abstract voidclearBuffer() throws java.io.IOException清除緩沖區(qū)中的當(dāng)前內(nèi)容。這個(gè)方法和clear()方法的區(qū)別是,如果緩沖區(qū)已經(jīng)被刷新,這個(gè)方法不會(huì)拋出IOException異常
public abstract voidclose() throws java.io.IOException刷新緩沖區(qū),關(guān)閉輸出流。注意,我們在編寫JSP頁面時(shí),不需要顯式地去調(diào)用這個(gè)方法,因?yàn)樵贘SP容器所生成的代碼中會(huì)自動(dòng)包含對(duì)close()方法的調(diào)用。
public abstract voidflush() throws java.io.IOException刷新緩沖區(qū),兩個(gè)步驟:1,提交response? 2.清空緩沖區(qū)
public intgetBufferSize()獲得緩沖區(qū)大小,同response.getBufferSize()相同
public abstract intgetRemaining()獲得緩沖區(qū)中未使用的字節(jié)數(shù)
public booleanisAutoFlush()判斷out對(duì)象是否是自動(dòng)刷新
<%@ page autoFlush="true" %> <%--Default--%>
內(nèi)置對(duì)象response相關(guān)方法
response.isCommitted()確認(rèn)response是否已經(jīng)committed
response.flushbuffer();同out.flush相同
解決方法:
增大緩沖區(qū)大?。?/p>
<%@ page buffer="10kb" %>
參考:http://jorton468.blog.163.com/blog/static/72588135201102441617287/