1. 程式人生 > >servlet04 response物件 ServletContext物件

servlet04 response物件 ServletContext物件

1 Response 代表Http響應的物件.用來封裝伺服器將要傳送給瀏覽器的響應資訊. 1.1 response繼承結構 ServletResponse介面 – 提供了一個response物件應該具有的功能 | |-- HttpServletResponse介面, 繼承了ServletResponse, 並添加了很多和Http協議相關的方法

1.2 response提供的常用方法 狀態行 HTTP/1.1 200 OK

若干響應頭 xxx : xxx

響應實體內容 xxx

設定狀態碼的方法 setStatus(int status)

設定響應頭的方法 setHeader(String name, String value)

設定響應實體內容的方法 getOutputStream() getWriter(); 1.3 response物件提供的功能 1.3.1 向客戶端傳送資料 getOutputStream() getWriter()

1.使用位元組流(getOutputStream())向客戶端傳送資料 (1)使用位元組流傳送英文資料

在瀏覽器中:

(2)使用位元組流傳送中文資料

亂碼產生的原因: 服務端在傳送資料, 資料使用的編碼是GBK(字串轉成二進位制陣列呼叫的是getBytes(), 這個方法如果不指定, 將會使用預設的平臺碼GBK) 瀏覽器自己有預設的編碼(比如谷歌), 如果不指定, 預設使用utf-8來接收資料. 傳送資料和接收資料使用的碼錶不一致造成亂碼

解決方案:
	第一步:設定伺服器端傳送的資料使用的編碼是UTF-8
	 
	第二步:設定瀏覽器接收資料時使用的編碼為UTF-8
	 
等價於<====>

2.使用字元流(getWriter())向客戶端傳送資料 (1)使用字元流傳送英文資料

(2)使用字元流傳送中文資料

在瀏覽器中:

亂碼產生的原因: 伺服器端使用字元流傳送資料, 底層需要將字元轉成位元組, 這時需要使用一個碼錶, 如果不指定, 伺服器預設使用iso8859-1編碼, 而這個編碼中沒有中文漢字, 所以必然會出現亂碼! 無論客戶端使用什麼編碼, 接收到的資料都是亂碼! 解決的方案: 第一步: 通知服務端使用utf-8來發送資料

第二步: 通知瀏覽器也使用utf-8來接收資料

總結: 其實在解決字元流傳送中文亂碼問題的過程中, response.setCharacterEncoding(“utf-8”);這行程式碼可以省略不寫, 原因是因為 response.setContentType(“text/html;charset=utf-8”);這行程式碼有兩個作用, 既會通知伺服器用utf-8來發送資料, 也會通知瀏覽器使用utf-8來接收資料!

細節: (1) 在一個請求中, getWriter()和getOutputStream()不能同時使用, 因為這兩個方法是互斥的! 如果兩個方法同時使用, 會丟擲異常

(2) 通過getWriter()和getOutputStream()這兩個方法獲取到的流, 使用完後不需要關閉, 因為伺服器會自動幫我們關閉!! (3) 通過getWriter()和getOutputStream()這兩個方法獲取到的流, 是指向response緩衝區, 而不是直接指向了瀏覽器!

1.3.2 實現請求重定向

請求重定向: 可以實現資源的跳轉 實現請求重定向:通過302狀態碼和location響應頭可以實現重定向 response.setStatus(302); response.setHeader(“location”, “/index.html”);

等價於 <=========> response.sendRedirect(“/day15/index.html”); 這行程式碼也可以實現重定向操作 重定向的特點: 兩次請求, 兩次響應 request物件不是同一個 位址列地址會發生變化 1.3.3 實現定時重新整理 通過refresh頭可以實現在多少秒之後跳轉到指定的資源 實現定時重新整理:

定時重新整理的特點: 兩次請求, 兩次響應 request物件不是同一個 位址列地址會發生變化 和重定向的區別在於, 重定向是立即發生跳轉, 而定時重新整理是在指定多少秒之後立即跳轉, 在跳轉之前, 可以向瀏覽器傳送響應, 並維繫一段時間. 1.3.4 控制瀏覽器的快取行為 不同的瀏覽器或者相同的瀏覽器的不同版本, 或者是相同的瀏覽器的相同版本做了不同的配置, 他們之間的快取行為可能都是不同的. 如果我們希望瀏覽器能夠快取要給資源, 或者不快取一個資源, 靠瀏覽器自己判斷是否快取是非常不靠譜的, 所以我們希望能夠明確的通知瀏覽器是否快取一個資源!

(1) 控制瀏覽器不要快取一個資源

(2) 控制瀏覽器快取一個資源

1.3.5 總結 1.請求轉發、重定向、定時重新整理三種資源跳轉方式的區別 (1)請求轉發

a) 一次請求,一次響應(request物件是同一個)
b) 位址列地址不會發生變化

c) 轉發只能在同一個WEB應用內部的資源之間進行跳轉,不能在不同的WEB應用或者是不同的虛擬主機之間進行跳轉。否則將會提示找不到資源.

(2)重定向 a) 兩次請求, 兩次響應(request物件不是同一個) b) 位址列地址會發生變化 c) 既可以在同一個WEB應用內部的資源之間進行跳轉, 也可以在不同的WEB應用或者是不同的虛擬主機之間進行跳轉, 如下:

(3)定時重新整理 a) 兩次請求, 兩次響應(request物件不是同一個) b) 位址列地址會發生變化 c) 既可以在同一個WEB應用內部的資源之間進行跳轉, 也可以在不同的WEB應用或者是不同的虛擬主機之間進行跳轉, 如下:

d) 定時重新整理和重定向主要的區別在於, 重定向是立即跳轉,而定時重新整理是在指定多少秒之後立即跳轉, 並且在跳轉之前,可以向瀏覽器傳送響應資料並維繫一段時間.

2.請求轉發/重定向/定時重新整理分別在什麼情況下使用? (1) 如果是同一個WEB應用內部資源的跳轉, 三種方式都可以, 具體使用哪一種: a) 如果希望在跳轉之後位址列地址不會發生變化, 這裡只能使用請求轉發 b) 如果希望在跳轉之後位址列地址會發生變化, 這裡可以使用重定向或定時重新整理 c) 如果在跳轉的過程中, 希望帶資料到目的地, 這裡只能使用請求轉發 d) 如果沒有什麼特別的需求, 僅僅是做一個跳轉, 推薦使用轉發. 因為轉發是一次請求, 可以減少訪問伺服器的次數, 減少伺服器的壓力! (2) 如果是不同的WEB應用之間資源的跳轉, 只能使用重定向和定時重新整理, 具體使用哪一種: 重定向是立即跳轉, 中間沒有間隔, 而定時重新整理可以指定多少秒之後再進行跳轉, 在跳轉之前, 還可以傳送響應到客戶端, 並維繫一段時間. a) 因此如果需要指定多少時間之後再跳轉可以使用定時重新整理, 如果在跳轉之前, 需要提示使用者, 可以使用定時重新整理. b) 如果沒有什麼特殊需要, 兩種方式都可以.

2 ServletContext物件 2.1 ServletContext物件簡介 代表整個WEB應用的物件 在伺服器啟動並載入WEB應用之後, 伺服器會立即建立代表當前WEB應用的ServletContext物件, 該物件會一直駐留在伺服器的記憶體中, 唯一的代表當前WEB應用. 在伺服器關閉或者WEB應用被移出容器, 隨著WEB應用的銷燬, ServletContext物件也跟著銷燬.

2.2 獲取ServletContext物件 ServletContext context = this.getServletContext(); 2.3 ServletContext作為域物件使用 域物件: 如果一個物件具有可以被看見的範圍, 利用該物件上的map可以在整個範圍內, 實現資料的共享. 在ServletContextDemo1中: // 2.作為域物件使用 context.setAttribute(“name”, “陳子樞”); context.setAttribute(“age”, “18”); context.setAttribute(“gender”, “男”);

在index.jsp中: <%= this.getServletContext().getAttribute(“name”) %>

<%= this.getServletContext().getAttribute(“age”) %>

<%= this.getServletContext().getAttribute(“gender”) %>

常用方法: setAttribute(String name, Object value); getAttribute(String name); removeAttribute(String name); getAttributeNames();

生命週期: 在WEB應用被載入後, 伺服器立即建立代表當前WEB應用的ServletContext物件, 在WEB應用被移出容器時, 隨著WEB應用的銷燬, 物件也跟著銷燬!

作用範圍: 整個WEB應用

主要功能: 在整個WEB應用中實現資料的共享

2.3.1 統計網站訪問人數. 需求: 統計本網站訪問的人數, 當用戶訪問本網站時, 響應該使用者是本網站今天第幾位訪客! 實現步驟: (1) 建立一個工程(day16_1)

(2) 建立兩個Servlet: ServletContextDemo1和ServletContextDemo2

(3) 在兩個Servlet中分別實現:當用戶訪問時, 響應該使用者是本網站的第幾位訪客