Web服務器回送給Web客戶端的HTTP響應消息分爲三個部分:狀態行、響應消息頭、消息正文(也叫實體內容)。Servlet程序經過調用ServletResponse對象的方法能夠向客戶端回送基本的響應消息。HttpServletResponse是專用於HTTP協議的ServletResponse子接口,它用於封裝HTTP響應消息,容許操控HTTP協議相關數據,包括響應頭和狀態碼。html
HTTP響應消息的響應狀態行可分爲三個部分:HTTP版本、狀態代碼和一條相關的提示消息,如:java
HTTP/1.1 200 OK編程
(1)ServletResponse和HttpServletResponse接口中定義了若干用於產生http響應消息中的頭字段的方法。如addHeader(String name, String value),用於增長一個同名的響應頭;setHeader(String name, String value),用新的設置值取代原來的設置值。數組
setContentType方法瀏覽器
setContentType方法用於設置Servlet輸出內容的MIME類型(網頁文檔類型"text/html",文本類型"text/plain",這個類型也做用於PrintWriter對象輸出文本內容所採用的編碼),對於HTTP協議來講,就是設置Content-Type響應頭字段的值。在MIME類型後面還能夠指定響應內容所使用的字符集類型,例如:"text/html; charset=GB2312",若是在MIME類型後面沒有指定,且使用getWriter方法返回的PrintWriter對象輸出文本內容時,Tomcat5.x將在MIME類型後面默認增長「ISO8859-1」的字符編碼類型。緩存
setCharacterEncoding方法服務器
該方法是在Servlet API 2.4規範中新增的方法,用於設置輸出內容的MIME聲明中的字符集編碼,對HTTP協議來講,就是設置Context-Type頭字段中的字符集編碼部分。若是沒有設置Content-Type頭字段,則setCharacterEncoding 設置的字符集類型不會出如今HTML的響應頭中,可是它對PrintWriter對象輸出文本內容時所採用的字符集編碼仍然有效。setCharacterEncoding 比 setContentType setLocale擁有更高的優先級,會覆蓋後面二者所設置的字符集編碼。ui
區別詳解:http://hi.baidu.com/chenlinping/item/f0b7668e2e4a52c8b171545f編碼
(2)關於響應頭的應用url
讓瀏覽器定時刷新網頁或跳轉至其餘頁面
HTTP協議中定義了一個Refresh頭字段,用於告訴瀏覽器過多少秒後自動刷新頁面。在refresh頭字段的時間設置後面還能夠用分號隔開,指定url地址,讓瀏覽器在指定時間值後自動去訪問該url。
response.setHeader("Refresh", "2; URL=http://www.oschina.net");
禁止瀏覽器緩存當前文檔內容
有三個HTTP響應頭字段均可以禁止瀏覽器緩存當前頁面,以下:
response.setDateHeader("Expires", 0); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache");
不是全部的瀏覽器都能徹底支持上面三個響應頭,所以最好同時使用。
使用<meta>標籤模擬響應消息頭
若是不會服務器端編程的普通HTML頁面製做者也想借助HTTP消息的響應頭字段來實現一些特殊功能,爲此,HTML語言中專門定義了<meta>標籤的http-equiv屬性來在HTML文檔中模擬HTTP響應消息頭,當瀏覽器讀取到HTML文檔中具備http-equiv屬性的<meta>標籤時,它會用於處理服務器發送響應消息頭同樣的方式進行處理。
<meta http-equiv="Expires" content="0"> <meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Pragma" content="no-cache">
<meta>標籤的一個最多見的應用就是用來設置當前頁面的字符集編碼
<meta http-equiv="Content-Type" content="text/html" charset="GB2312">
Servlet程序經過ServletResponse對象將響應正文傳遞給Servlet引擎,再由Servlet引擎將響應正文輸出到客戶端。但ServletResponse並未定義直接輸出響應正文的方法(如prinltln這種方法),而是定義了一些方法(getWriter方法)來返回Servlet引擎提供的輸出流對象,再由Servlet程序經過這個輸出流對象將響應正文寫入到Servlet引擎。
(1)getOutputStream與getWriter方法
getOutputStream方法用於返回Servlet引擎建立的字節輸出流對象,Servlet程序能夠按字節形式輸出響應正文。
getWriter方法用於返回Servlet引擎建立的字符輸出流對象,Servlet程序能夠按字符形式輸出響應正文。
getOutputStream方法返回的字節輸出流對象的類型爲ServletOutputStream,它能夠直接輸出字節數組中的二進制數據。
getWriter方法將Servlet引擎的數據緩衝區包裝成PrintWriter類型的字符輸出流對象後返回,PrintWriter對象能夠直接輸出字符文本內容。
getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法後,就不能再調用另外一方法。
此外:
setContentType方法或setCharacterEncoding方法設置的字符集編碼只對PrintWriter對象輸出的內容起做用;ServletOutputStream對象採用ISO8859-1編碼將數據輸出到緩衝區,若是ISO8859-1不支持該字符,會報CharConversionException。
哪怕setContentType設置的編碼不影響ServletOutputStream對象輸出的內容,但調用該方法後,響應消息依舊包含Content-Type請求頭,即瀏覽器依然是按MIME後跟着編碼來顯示網頁。
(2)輸出緩衝區
Servlet程序輸出的HTTP消息的響應正文不是直接發送給客戶端,而是首先被寫入到Servlet引擎提供的一個輸出緩衝區中。