1、昨天內容回顧
2、servlet裏面兩個對象
客戶端每次發送http請求時候,服務器會爲每次的請求創建一個對象request,同時也會創建一個resposne對象作爲響應
3、response對象的介紹
* 名稱:HttpServletResponse:作爲客戶端響應
* HttpServletResponse是一個接口,父接口是 ServletResponse
* 常用的方法
在http協議裏面,分爲三部分
1、響應行
** 設置狀態碼 setStatus(int sc)
2、響應頭
可以是一個key對應一個value,一個key對應多個value
** 設置頭:setHeader(java.lang.String name, java.lang.String value)
- 一個key對應一個value
- 比如:
setHeader("aa","100");
setHeader("aa","101");
結果:101
** 針對不同的類型提供了方法
- setIntHeader(java.lang.String name, int value)
- setDateHeader(java.lang.String name, long date) :值是一個毫秒數
** 設置頭:addHeader(java.lang.String name, java.lang.String value)
- 一個key對應多個value
- 比如:
addHeader("bb","200");
addHeader("bb","201");
結果:bb:200,201
** 針對不同的類型提供了方法
- addIntHeader(java.lang.String name, int value)
- addDateHeader(java.lang.String name, long date) :值是一個毫秒數
3、響應體
** 在頁面顯示的內容
getWriter(): 使用字符流
getOutputStream():使用字節流
***案例
** 從服務器上拿到的數據顯示在頁面上,這些操作都可以使用response實現
4、案例一:使用response實現登錄的重定向
* 有一個登錄頁面
** 有表單,有輸入項(用戶名和密碼)
** 提交按鈕
* 有一個servlet來處理登錄操作
** 輸入正確的用戶名和密碼,直接在頁面輸出一個 登錄成功
** 用戶名或者密碼錯誤,重定向到登錄頁面
1、接受到傳遞過來的用戶名和密碼
** request.getParameter();
2、判斷用戶名和密碼是否正確(admin 123456)
3、如果正確,直接在頁面輸出 登錄成功
4、如果錯誤,重定向到登錄頁面
* //設置狀態碼 302
response.setStatus(302);
//重定向到登錄頁面 使用頭 Location
response.setHeader("Location", "/day10/response/login.html");
5、案例二:使用response實現頁面的定時跳轉(控制秒數)
* 使用頭 Refresh
* servlet寫法:response.setHeader(“Refresh”, “5;url=/day10/response/login.html”);
* 在頁面中寫法:在頭標籤head標籤裏面,
* 想要實現控制秒數,使用js操作
- var m = 5;
function change1() {
//alert(‘1’);
//獲取到span
var span1 = document.getElementById(“spanid”);
//使用innerHTML寫入到span裏面
span1.innerHTML = m;
m–;
}
//實現定時實現
setInterval(“change1();”,1000);
6、案例三:使用response實現禁用瀏覽器緩存
** 禁用瀏覽器緩存可以保證每次數據都是最新的(數據是不斷變化)
- 比如 網銀
** 使用三個頭信息
Cache-Control : no-cache
Pragma : no-cache
Expires: -1
** 獲取當前時間:
- Date date = new Date();
date.toLocaleString();
** 如果在一些版本(ie6)的瀏覽器中出現了數據不能變化,這個時候出現了緩存,可以禁用瀏覽器緩存
- //禁用瀏覽器緩存
//Cache-Control : no-cache
response.setHeader(“Cache-Control”, “no-cache”);
//Pragma : no-cache
response.setHeader(“Pragma”, “no-cache”);
//Expires: -1:固定寫法
** Expires頭時候,值是一個毫秒數,固定寫法 -1
response.setDateHeader(“Expires”, -1);
7、response向頁面輸出中文的亂碼問題
* getOutputStream():使用字節流:處理中文亂碼的方式
* 使用這種方式輸出中文,不一定會有問題
* 設置瀏覽器的編碼和字節數組的編碼一致
* 設置瀏覽器的編碼:response.setHeader("Content-Type", "text/html;charset=utf-8");
* 設置字節數組的編碼:response.getOutputStream().write("字節流中文測試".getBytes("utf-8"));
* getWriter(): 使用字符流:處理中文亂碼的問題
* 使用這種方式,輸出中文一定會有問題
** 數據是放在response緩衝區裏面,默認編碼 iso8859-1,這種編碼是不支持中文
* 如何解決:
1、設置response緩衝區編碼
response.setCharacterEncoding("utf-8");
2、設置瀏覽器的編碼
response.setHeader("Content-Type", "text/html;charset=utf-8");
8、開發中一些細節問題(注意的問題)
* 重定向操作(有兩種寫法)
** //設置狀態碼 302
response.setStatus(302);
//重定向到登錄頁面 使用頭 Location
response.setHeader(“Location”, “/day10/response/login.html”);
** //簡寫方式
response.sendRedirect("/day10/response/login.html");
* 字符流解決中文問題(兩種寫法)
**
1、設置response緩衝區編碼
response.setCharacterEncoding("utf-8");
2、設置瀏覽器的編碼
response.setHeader("Content-Type", "text/html;charset=utf-8");
** //簡寫方式
response.setContentType("text/html;charset=utf-8");
* text/html;charset=utf-8:中間必須使用分號;隔開
* 使用字符流方式,不能直接向頁面輸出數字
— 會去碼錶中取找數字對應的字符,把字符輸出
- 想要輸出一個數字,使用字符串形式;response.getWriter().write("111");
* 字節流和字符流是互斥的(不能同時一起使用)
* 或者使用字節流,或者使用字符流,而不能一起使用
9、使用response實現文件的下載
*文件下載有兩種方式:
第一種方式,直接使用超鏈接來實現