一、Response 原理和繼承結構
二、HttpServletResponse 類的作用
HttpServletResponse 類和 HttpServletRequest 類一樣。 每次請求進來, Tomcat 服務器都會創建一個 Response 對象傳遞給 Servlet 程序去使用。
HttpServletRequest 表示請求過來的信息, HttpServletResponse 表示所有響應的信息,我們如果需要設置返回給客戶端的信息, 都可以通過 HttpServletResponse 對象來進行設置。
二、設置響應信息
1、設置響應行
響應頭格式:
HTTP/1.1 200 ok
設置狀態碼:
setStatus(int sc); // sc為狀態碼
2、設置響應頭
設置響應頭信息:
setHeader(String name, String value);//通過name來給指定的響應頭設置信息
3、設置響應體
使用步驟:
(1)獲取輸出流
字符輸出流:PrintWriter getWriter()
字節輸出流:ServletOutputStream getOutputStream()
(2)使用輸出流,將數據輸出到客戶端瀏覽器。
三、獲取輸出流及回傳數據
1、兩個輸出流
通過 HttpServletResponse 對象可以獲取兩個輸出流:
字節流 ServletOutputStream getOutputStream(); 常用於下載(傳遞二進制數據)
字符流 PrintWriter getWriter(); 常用於回傳字符串(常用)
注意:兩個流同時只能使用一個。使用了字節流,就不能再使用字符流,反之亦然,否則就會報錯。
2、服務器輸出字符數據到瀏覽器
步驟:
(1)獲取字符輸出流
(2)輸出數據
Demo:
1 //1.獲取字符輸出流
2 PrintWriter pw = response.getWriter(); 獲取的流的默認編碼是ISO-8859-1
3 //2.輸出數據
4 //pw.write("<h1>hello response</h1>");
5 pw.write("你好啊啊啊 response");
上面的這種方式,向頁面輸出英文沒有問題,而且HTML標簽也會被正常解析,但是如果輸出中文,就會產生亂碼。
亂碼問題:
解決亂碼:
1 //獲取流對象之前,設置流的默認編碼:ISO-8859-1 設置為:utf-8
2 // response.setCharacterEncoding("utf-8");
3 //告訴瀏覽器,服務器發送的消息體數據的編碼。建議瀏覽器使用該編碼解碼
4 //response.setHeader("content-type","text/html;charset=utf-8");
5
6 //簡單的形式,設置編碼
7 response.setContentType("text/html;charset=utf-8"); 8
9 //1.獲取字符輸出流
10 PrintWriter pw = response.getWriter(); 11 //2.輸出數據
12 //pw.write("<h1>hello response</h1>");
13 pw.write("你好啊啊啊 response");
注意:一定要在獲取流之前設置編碼。
3、服務器輸出字節數據到瀏覽器(一般用於非文字的傳輸)
步驟:
(1)獲取字節輸出流
(2)輸出數據
Demo:
1 // 設置消息體數據及編碼
2 response.setContentType("text/html;charset=utf-8"); 3
4 //1.獲取字節輸出流
5 ServletOutputStream sos = response.getOutputStream(); 6 //2.輸出數據
7 sos.write("你好".getBytes("utf-8"));
四、請求重定向
請求重定向:是指客戶端給服務器發請求, 然后服務器告訴客戶端說一些新地址,讓客戶端去新地址訪問。 叫請求重定向(因為之前的地址可能已經被廢棄)
請求重定向:是一種客戶端資源跳轉的方式。
原理圖:
請求重定向的第一種方案:
// 設置響應狀態碼 302 , 表示重定向
response.setStatus(302);
// 設置響應頭, 說明 新的地址在哪里
response.setHeader("Location", "http://localhost:8080");
請求重定向的第二種方法(推薦使用):
response.sendRedirect("http://localhost:8080");
重定向與轉發特點
重定向(redirect)的特點:[重要]
① 地址欄會發生變化;
② 重定向可以訪問其他站點(服務器)的資源;
③ 重定向是兩次請求,不能使用 request 對象來共享數據;
④ 不能訪問 WEB-INF 下的資源,但是可以訪問工程外的資源;
請求轉發(forward)的特點:[重要]
① 轉發地址欄路徑不變
② 轉發只能訪問當前工程內容下的資源
③ 轉發是一次請求,可以使用 request 對象來共享數據
路徑問題
相對路徑:通過性對路徑不可以確定唯一資源
如:./index.html;
特點:不以 / 開頭,以 . (點)開頭
規則:找到當前資源和目標資源之間的相對位置關系
./ :表示當前目錄
../ :表示后退返回上一級目錄
絕對路徑:通過絕對路徑可以確定唯一資源
如:http://localhost/web/demo1
特點:以 / 開頭
規則:判斷定義的路徑是給誰用的,判斷請求將來從哪里發出
① 給客戶端瀏覽器使用:需要加虛擬目錄(項目的訪問路徑)
如:頁面中的超鏈接,form表單,重定向等。
注意:不建議把虛擬目錄寫死,一般都是動態獲取。獲取方法:
request.getContextPath()
② 給服務器使用:不需要加虛擬目錄
如:轉發路徑;