從新認識HttpServletResponse對象,你學會了嗎?--樂字節

HttpServletResponse對象

Web服務器收到客戶端的http請求,會針對每一次請求,分別建立一個用於**表明請求**的 request 對象和**表明響應**的 response 對象。

request 和 response 對象表明請求和響應:獲取客戶端數據,須要經過 request 對象;**向客戶端輸出數據,須要經過 response 對象**。

HttpServletResponse 的主要功能用於服務器對客戶端的請求進行響應,將 Web 服務器處理後的結果返回給客戶端。service()方法中形參接收的是 HttpServletResponse 接口的實例化對象,這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。

響應數據

接收到客戶端請求後,能夠經過 HttpServletResponse 對象直接進行響應,響應時須要獲取輸出流。

有兩種形式:

    **getWriter()** **獲取字符流(只能響應回字符)**

    **getOutputStream()**   **獲取字節流(能響應一切數據)**

響應回的數據到客戶端被瀏覽器解析。

<font color="red">注意:二者不能同時使用。</font>
// 字符輸出流
PrintWriter writer = response.getWriter();
writer.write("Hello");
writer.write("<h2>Hello</h2>");
// 字節輸出流
ServletOutputStream out = response.getOutputStream();
out.write("Hello".getBytes());
out.write("<h2>Hello</h2>".getBytes());
設置響應類型,默認是字符串
// 設置響應MIME類型
response.setHeader("content-type","text/html"); // html

響應亂碼問題

在響應中,若是咱們響應的內容中含有中文,則有可能出現亂碼。這是由於服務器響應的數據也會通過網絡傳輸,服務器端有一種編碼方式,在客戶端也存在一種編碼方式,當兩端使用的編碼方式不一樣時則出現亂碼。

getWriter()的字符亂碼html

對於 getWriter()獲取到的字符流,響應中文一定出亂碼,因爲服務器端在進行編碼時默認會使用 ISO-8859-1 格式的編碼,該編碼方式並不支持中文。

要解決該種亂碼只能在服務器端**告知服務器**使用一種可以支持中文的編碼格式,好比咱們一般用的"UTF-8"。
response.setCharacterEncoding("UTF-8");
此時還只完成了一半的工做,要保證數據正確顯示,還須要**指定客戶端**的解碼方式。
response.setHeader("content-type", "text/html;charset=UTF-8");
兩端指定編碼後,亂碼就解決了。一句話:<font color="red">保證發送端和接收端的編碼一致</font>
// 設置服務端的編碼
response.setCharacterEncoding("UTF-8");
// 設置客戶端的響應類型及編碼
response.setHeader("content-type","text/html;charset=UTF-8");
// 獲得字符輸出流
PrintWriter writer = response.getWriter();
writer.write("<h2>你好</h2>");

以上兩端編碼的指定也能夠使用一句替代,同時指定服務器和客戶端java

response.setContentType("text/html;charset=UTF-8");

getOutputStream()字節亂碼瀏覽器

對於 getOutputStream()方式獲取到的字節流,響應中文時,因爲自己就是傳輸的字節, 因此此時可能出現亂碼,也可能正確顯示。當服務器端給的字節剛好和客戶端使用的編碼方式一致時則文本正確顯示,不然出現亂碼。不管如何咱們都應該準確掌握服務器和客戶端使用的是那種編碼格式,以確保數據正確顯示。

**指定客戶端和服務器使用的編碼方式一致。**
response.setHeader("content-type","text/html;charset=UTF-8");
// 設置客戶端的編碼及響應類型
ServletOutputStream out = response.getOutputStream();
response.setHeader("content-type","text/html;charset=UTF-8");
out.write("<h2>你好</h2>".getBytes("UTF-8"));
一樣也能夠使用一句替代
// 設置客戶端與服務端的編碼
response.setContentType("text/html;charset=UTF-8");

總結:要想解決響應的亂碼,只須要保證使用支持中文的編碼格式。而且保證服務器端 和客戶端使用相同的編碼方式便可服務器

重定向

重定向是一種服務器指導,客戶端的行爲。客戶端發出第一個請求,被服務器接收處理後,服務器會進行響應,在響應的同時,服務器會給客戶端一個新的地址(下次請求的地址 response.sendRedirect(url);),當客戶端接收到響應後,會馬上、立刻、自動根據服務器給的新地址發起第二個請求,服務器接收請求並做出響應,重定向完成。

從描述中能夠看出重定向當中有兩個請求存在,而且屬於客戶端行爲。
// 重定向跳轉到index.jsp
response.sendRedirect("index.jsp");
經過觀察瀏覽器咱們發現第一次請求得到的響應碼爲 302,而且含有一個 location 頭信息。而且地址欄最終看到的地址是和第一次請求地址不一樣的,地址欄已經發生了變化。

從新認識HttpServletResponse對象,你學會了嗎?--樂字節

請求轉發與重定向的區別

請求轉發和重定向比較:

從新認識HttpServletResponse對象,你學會了嗎?--樂字節 二者均可進行跳轉,根據實際需求選取便可。網絡

學習更多知識,請加入企鵝羣:1080355292,入羣暗號(33)jsp

相關文章
相關標籤/搜索