日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Servlet中response对象Commit状态的分析

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet中response对象Commit状态的分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

response是服務端對客戶端請求的一個響應,其中封裝了響應頭、狀態碼、內容(也就是最終要在瀏覽器上顯示的HTML代碼或者其他數據格式)等。

服務端在把response提交到客戶端之前,會使用一個緩沖區,并向該緩沖區內寫入響應頭和狀態碼,然后將所有內容flush(flush包含兩個步驟:先將緩沖區內容發送至客戶端,然后將緩沖區清空)。

這就標志著該次響應已經committed(提交)。


對于當前頁面中已經committed(提交)的response:

就不能再使用這個response向緩沖區寫任何東西? 。(原文這里可能有錯誤

不可以再進行send***這類發送響應內容的操作(因為響應已經提交給客戶端),

可以使用set***這類設置響應內容的函數(設置后無效,因為響應已經提交給客戶端),

實測可以繼續進行頁面內容的輸出(--此處存疑--不能理解--實測(執行response.getWriter().close()后會導致后續輸出無效,但不會爆異常)),

實測可以進行request.getRequestDispatcher(“”).include(request, response);,

實測不可以進行request.getRequestDispatcher(“”).forward(request, response);(會拋出IllegalStateException異常Cannot forward after response has been committed),

(注:以為JSP中,response是一個JSP頁面的內置對象,所以同一個頁面中的response.XXX()是同一個response的不同方法,只要其中一個已經導致了committed,那么其它類似方式的調用都會導致 IllegalStateException異常)。


導致 response?狀態變為 committed 的原因:

send***這類方法:向客戶端發送狀態碼或重定向會直接提交響應。

刷新緩存:當response對象緩存區滿時,或者使用response對象的flushbuffer方法會刷新response對象的緩存導致響應提交。

轉發:將未提交的response通過forward轉發可能會在轉發目標的處理流程內被提交(include轉發不會)。

forward指令和include指令很相似,它們都采用方法來導入目標。

執行forward指令時,response必須未提交,目標獲得的response與原Servlet中同一個(ResponseFacade對象)。原先存放在response對象中的內容將會自動被清除,目標可以直接發出響應,之后程序流程回到原Servlet轉發處繼續執行,但是原Servlet似乎連頁面內容都不可輸出了。

而執行include指令時,目標獲得的response與原Servlet中不是同一個(被換成了一個ApplicationHttpResponse對象,讓目標無法對源請求做出實質響應,但是該對象進行提交操作后會導致原Servlet中的response對象也變為已提交,但仍然可以進行頁面輸出)。原Servlet把目標產生的響應的內容部分包含到自身響應的內容中,目標改變響應消息的狀態碼和響應頭的語句執行結果將被忽略(即被調用的Servlet的響應只有內容部分會并入原Servlet的響應的內容部分中)。

關于forward和include的詳細分析不在此處深究。


關于JSP中的flushBuffer

每一個JSP頁面都有一個緩沖區,默認的緩沖區大小為8KB,如果緩沖區被占滿的話,web服務器就會自動將response 進行commit,然后清空緩沖區(即flush)。

JSP內置對象out相關方法:

public abstract void?clear() throws java.io.IOException清除緩沖區中的內容。如果緩沖區已經被刷新,clear()方法將拋出IOException異常
public abstract void?clearBuffer() throws java.io.IOException清除緩沖區中的當前內容。這個方法和clear()方法的區別是,如果緩沖區已經被刷新,這個方法不會拋出IOException異常
public abstract void?close() throws java.io.IOException

刷新緩沖區,關閉輸出流。注意,我們在編寫JSP頁面時,不需要顯式地去調用這個方法,因為在JSP容器所生成的代碼中會自動包含對close()方法的調用。

public abstract void?flush() throws java.io.IOException刷新緩沖區,兩個步驟:1,提交response? 2.清空緩沖區
public int?getBufferSize()獲得緩沖區大小,同response.getBufferSize()相同
public abstract int?getRemaining()獲得緩沖區中未使用的字節數
public boolean?isAutoFlush()判斷out對象是否是自動刷新?
<%@ page autoFlush="true" %> <%--Default--%>

內置對象response相關方法:

response.isCommitted()確認response是否已經committed
response.flushbuffer();同out.flush相同

增大緩沖區大小:

?

<%@ page buffer="10kb" %>


?文參考:https://www.cnblogs.com/ismallboy/p/6785328.html

轉載于:https://www.cnblogs.com/Leroscox/p/8305141.html

總結

以上是生活随笔為你收集整理的Servlet中response对象Commit状态的分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。