無標(biāo)題文章

摘自: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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 標(biāo)簽 如果要配置的標(biāo)簽,那么必須要先配置標(biāo)簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,514評(píng)論 0 0
  • 無阻塞io是使用單線程或者只使用少量的多線程,每個(gè)連接共用一個(gè)線程,當(dāng)處于等待(沒有事件)的時(shí)候線程資源可以釋放出...
    zhangshijie閱讀 3,169評(píng)論 0 1
  • 從打記事起,我就和爺爺生活在一起。奶奶在我不到三歲的時(shí)候就去世了,爺爺因?yàn)樯眢w不好提前辦理了離休手續(xù),回鄉(xiāng)下修養(yǎng),...
    雛菊淺笑閱讀 575評(píng)論 0 1
  • 一席安好,何以求索。轉(zhuǎn)眼間假期已結(jié),仿佛這些時(shí)日不曾度過,恍惚間不知做過些什么,埋于這一隅小屋,偶爾煩躁柴米油鹽,...
    許小慢閱讀 466評(píng)論 0 1
  • 21天拆書訓(xùn)練營第11天 《終身成長》P254-255 虛假的成長模式 第一種錯(cuò)誤理解:很多人將他們...
    紅利的財(cái)富花園閱讀 397評(píng)論 0 1

友情鏈接更多精彩內(nèi)容