教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓之HttpServletResponse的輸出問題

更新時間:2016年06月29日18時09分 來源:傳智播客Java篇培訓學院 瀏覽次數(shù):

1 response的輸出流
response對象有getWriter()和getOutputStream()兩個方法,它們都是用來向客戶端響應用的流對象,不過一個是字符流,另一個是字節(jié)流。
  • PrintWriter getWriter():獲取響應字符流,用來向客戶端響應二進制數(shù)據(jù),例如圖片;
  • ServletOutputStream getOutputStream():獲取響應字節(jié)流,用來向客戶端響應文本數(shù)據(jù),例如HTML代碼。
這兩者之前只能使用其中一個,也就是說,要么使用字符流,要么使用字節(jié)流,不能兩者兼得。如果在獲取其中一個流對象后,再去獲取另一個流,那么就會出現(xiàn)異常。
2 刷新輸出流
response內(nèi)部的輸出流有8KB的緩沖區(qū),如果緩沖區(qū)滿了的話,那么response會自動去提交,即把緩沖區(qū)內(nèi)容輸出給客戶端。這時調(diào)用response的isCommited()方法返回的就是true,表示response已經(jīng)提交過至少一次了。
也可以在緩沖區(qū)沒有裝滿時調(diào)用response.flushBuffer()方法刷新輸出流,把緩沖區(qū)中的數(shù)據(jù)發(fā)送到客戶端去。同樣,這也會導致response的isCommited()方法返回的就是true,表示response已經(jīng)提交過至少一次了。
其實也可以調(diào)用response.getWirter().flush()方法達到與調(diào)用response.flushBuffer()相同的效果。這兩種方式基本相同!
一旦response的isCommited()方法返回true,這說明服務器已經(jīng)至少把狀態(tài)碼、響應頭等數(shù)據(jù)發(fā)送給客戶端了,也就是說已經(jīng)開始向客戶響應了。
但是,這里你要注意一下,不是說服務器向客戶端發(fā)送了數(shù)據(jù),就表示數(shù)據(jù)一定會顯示在瀏覽器上。因為客戶端的瀏覽器也許會有自己的緩存,在瀏覽器的緩存沒有滿之前,瀏覽器是不會去顯示的。例如IE8和Google瀏覽器就是這樣,但FireFox會馬上顯示數(shù)據(jù)!
測試得到IE8的緩存為16KB,只要響應數(shù)據(jù)大于16KB就會在IE8上顯示出來。、

本文版權歸傳智播客Android培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Android培訓學院
首發(fā):http://xamj520.com/Android
0 分享到:
和我們在線交談!