Response的功能

1.向客戶端發(fā)送數(shù)據 (重點是亂碼問題)

getOutputStream()
getWriter()

字節(jié)流發(fā)送數(shù)據的中文亂碼問題

服務器端指定了用utf-8來發(fā)送數(shù)據, 瀏覽器在接受數(shù)據時, 如果不指定將使用默認的平臺碼GBK, 編解碼不一致導致亂碼.
解決方案:
response.setHeader("Content-Type", "text/html;charset=utf-8");// 通知瀏覽器使用utf-8打開服務器發(fā)送過去的數(shù)據
response.getOutputStream().write("中國".getBytes("utf-8"));// 指定編碼為utf-8

字符流發(fā)送數(shù)據的中文亂碼問題

利用字符流發(fā)送數(shù)據, 底層還是要轉成字節(jié). 服務器端如果不手動指定, 服務器默認會使用iso8859-1碼表, 由于里面沒有中文漢字, 所以服務器端發(fā)送給客戶端就是一堆亂碼, 客戶端不管使用什么碼表都無法轉成正常的字符
服務器會根據getCharacterEncoding()方法返回的編碼來發(fā)送數(shù)據, 如果沒有指定, 該方法默認返回iso8859-1
解決方案:
第一步, 需要指定服務器發(fā)送數(shù)據使用utf-8
response.setCharacterEncoding("utf-8"); //通知服務器使用utf-8來發(fā)送響應實體中數(shù)據
第二步: 需要指定瀏覽器在接收數(shù)據時也使用同一個編碼來打開數(shù)據
response.setHeader("Content-Type", "text/html;charset=utf-8");
等價于<==>
response.setContentType("text/html;charset=utf-8");

在通知瀏覽器使用什么編碼接受服務器發(fā)送的數(shù)據時, 服務器很智能, 會使用相同的編碼來發(fā)送數(shù)據, 所以指定服務器以什么編碼發(fā)送數(shù)據的代碼可以省略不寫

總結: 不管是字符流還是字節(jié)流, 解決亂碼問題, 可以用一行代碼搞定:

response.setContentType("text/html;charset=xxx");

getOutputStream()和getWriter() 這兩個方法是互斥的, 在一次請求當中調用了其中的一個, 就不能再調用另一個!!!
在調用完getOutputStream()或getWriter()方法之后, 不需要手動去關閉流, 服務器會自動幫我們去關閉!!!
這個兩個方法獲取到的流并不是指向客戶端的流, 而是指向response緩沖區(qū)的流, 通過流將數(shù)據寫入response緩沖區(qū), service方法執(zhí)行結束, 請求回到服務器, 由服務器將數(shù)據組織成響應消息打給瀏覽器!!


2.實現(xiàn)重定向

重定向的原理就是302+location, 通過設置狀態(tài)碼302和location響應頭就可以實現(xiàn)重定向的效果
response.setStatus(302);
response.setHeader("Location", "/Day09/index.jsp");
這兩行代碼等價于
response.sendRedirect("/Day09/index.jsp");


3.實現(xiàn)定時刷新

定時刷新是通過Refresh響應頭, 可以實現(xiàn)在多少秒之后跳轉到另外一個資源
response.setHeader("Refresh", "3;url=/Day09/index.jsp");


總結:

請求轉發(fā)/請求重定向/定時刷新都可以實現(xiàn)資源的跳轉, 區(qū)別是什么呢?**

請求轉發(fā):
一次請求,一次響應 request對象是同一個
地址欄不會發(fā)生變化
只能用于服務器內部的資源跳轉, 并且只能是同一應用中的不同資源上進行跳轉, 不可用在不同應用和不同服務器中的資源跳轉

請求重定向:
兩次請求,兩次響應 request對象不是同一個
地址欄會發(fā)生變化
可以用于服務器內部的資源跳轉, 也可以用于不同應用和不同服務器之間的資源跳轉

定時刷新:
兩次請求,兩次響應 request對象不是同一個
地址欄會發(fā)生變化
可以用于服務器內部的資源跳轉, 也可以用于不同應用和不同服務器之間的資源跳轉
和重定向不同的是, 定時刷新可以在刷新到新的地址之間設置一個時間, 在間隔的這段時間內可以輸出文本到瀏覽器并維系一段時間

那什么時候用哪種方式進行資源的跳轉呢?
如果是同一服務器中的同一應用內部的資源跳轉:
~如果需要利用request域在跳轉的資源之間傳輸數(shù)據, 只能用請求轉發(fā)
~如果不想讓地址欄發(fā)生變化, 只能用請求轉發(fā)
~如果需要地址欄發(fā)生變化, 只能用重定向或定時刷新
~如果沒有什么特殊需求, 三種方式都可以, 但是推薦使用轉發(fā), 可以減少請求次數(shù)降低服務器的壓力.
~如果只是想更新刷新操作, 最好使用重定向或定時刷新, 使用請求轉發(fā), 在刷新時會把剛才的操作再做一遍, 可能會導致一些問題, 比如表單重復提交或重復支付訂單等
如果是不同服務器或不同應用內部的資源跳轉, 只能用重定向或這定時刷新:
重定向和定時刷新的主要區(qū)別在于: 重定向會立即跳轉, 而定時刷新可以設置一個時間間隔, 在指定時間后再進行跳轉.
如果在跳轉之前需要輸出提示信息(如: 注冊成功, xx秒后跳轉到xxx)只能用定時刷新, 否則兩種方式都可以.


4.控制瀏覽器的緩存行為 (!掌握)

由于不同的瀏覽器的緩存行為可能是不同的, 我們可以在服務器中通過設置響應頭來控制瀏覽器的緩存行為!!
控制瀏覽器不要緩存:
setDateHeader("Expires", -1);
setHeader("Cache-control", "no-cache");
setHeader("Pragma", "no-cache");
控制瀏覽器緩存:
setDateHeader("Expires", System.currentTimeMillis()+10006060*24);
setHeader("Cache-control", "max-age=60");

附:
HTTP1.1 響應碼 -- 一個3位的數(shù)字, 范圍為100~600, 表示服務器處理請求的結果
200~299 表示服務器正確的處理了請求
300~399 表示服務器正確的處理了本次請求, 但是如果想要繼續(xù)執(zhí)行, 還需要更多的額外信息
400~499 表示客戶端的請求有問題
500~599 表示服務器端發(fā)生了問題

200 表示服務器處理成功
302 表示請求重定向
304/307 通知瀏覽器使用緩存資源
404 表示客戶端請求的資源不存在
500 表示服務器端處理請求出錯

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市正驻,隨后出現(xiàn)的幾起案子泡仗,更是在濱河造成了極大的恐慌础爬,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牲蜀,居然都是意外死亡,警方通過查閱死者的電腦和手機绅这,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門涣达,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人证薇,你說我怎么就攤上這事度苔。” “怎么了浑度?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵寇窑,是天一觀的道長。 經常有香客問我箩张,道長甩骏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任伏钠,我火速辦了婚禮横漏,結果婚禮上,老公的妹妹穿的比我還像新娘熟掂。我一直安慰自己缎浇,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布赴肚。 她就那樣靜靜地躺著素跺,像睡著了一般二蓝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上指厌,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天刊愚,我揣著相機與錄音,去河邊找鬼踩验。 笑死鸥诽,一個胖子當著我的面吹牛,可吹牛的內容都是我干的箕憾。 我是一名探鬼主播牡借,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼袭异!你這毒婦竟也來了钠龙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤御铃,失蹤者是張志新(化名)和其女友劉穎碴里,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咬腋,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年谷羞,在試婚紗的時候發(fā)現(xiàn)自己被綠了帝火。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡湃缎,死狀恐怖犀填,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嗓违,我是刑警寧澤九巡,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蹂季,受9級特大地震影響冕广,放射性物質發(fā)生泄漏。R本人自食惡果不足惜偿洁,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一撒汉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涕滋,春花似錦睬辐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侵俗。三九已至,卻和暖如春丰刊,著一層夾襖步出監(jiān)牢的瞬間隘谣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工啄巧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寻歧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓棵帽,卻偏偏與公主長得像熄求,于是被迫代替她去往敵國和親渣玲。 傳聞我的和親對象是個殘疾皇子逗概,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 編碼問題一直困擾著開發(fā)人員,尤其在 Java 中更加明顯忘衍,因為 Java 是跨平臺語言逾苫,不同平臺之間編碼之間的切換...
    x360閱讀 2,480評論 1 20
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)枚钓,斷路器铅搓,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • request亂碼指的是:瀏覽器向服務器發(fā)送的請求參數(shù)中包含中文字符,服務器獲取到的請求參數(shù)的值是亂碼搀捷; resp...
    Aldeo閱讀 1,123評論 0 1
  • 主要內容 1. 字符編碼理論簡述 本文主要是圍繞Web開發(fā)中涉及到的中文編碼這一常見問題展開星掰,包括了對字符編碼基礎...
    topgunviper閱讀 13,300評論 5 28
  • 躁動的鞭炮 空氣中充斥著火藥的味道 新年的禱告 穿過我的耳道 聽起來是那么聒噪 裹緊棉襖 蜷縮在那 顫抖的樓腳
    書中簡閱讀 138評論 0 1