HttpServletResponse. 20
產生響應狀態行... 20
HTTP狀態常量... 20
setStatus(int sc)20
sendError21
構建響應消息頭... 21
addHeader與setHeader21
addIntHeader與setIntHeader21
addDateHeader與setDateHeader22
setContentLength. 22
setContentType. 22
setCharacterEncoding. 22
setLocale. 23
containsHeader23
響應頭的應用... 23
讓瀏覽器定時刷新網頁或跳轉到其他頁面... 23
禁止瀏覽器緩存當前文檔內容... 24
使用<meta>標簽模擬響應消息頭... 24
創建響應正文... 24
getOutputStream與getWriter方法... 24
輸出緩沖區... 25
文件下載... 27
<img>動態圖像... 28
請求轉發與請求重定向... 30
RequestDispatcher接口... 30
用include方法實現資源包含... 32
輸出靜態內容時默認Servlet所采用的流分析... 33
用forward方法實現請求轉發... 34
RequestDispatcher.forward方式應用細節... 35
用sendRedirect方法實現請求重定向... 38
請求重定向(sendRedirect)與請求轉發(forward)的區別... 39
HttpServletResponseHTTP響應消息分為三們部分:狀態行、響應消息頭、消息實體。
HTTP狀態常量HttpServletResponse定義了若干與HTTP響應狀態碼對應的常量,以SC(Status Code)開頭。
setStatus(int sc)響應狀態行:HTTP版本+狀態代碼+提示信息
HTTP/1.1 200 OK
用于設置HTTP響應消息的狀態碼,并生成響應狀態行。正常情況下的響應碼為200,Web服務器默認自動
產生這種正常情況下的響應狀態行,所以,通常情況下的Servlet不需要調用該方法來指定狀態代碼和產生響應狀態行。只有在HTTP響應消息中使用特殊的狀態碼時,才需要調用這個方法
sendErrorsendError(int sc)
sendError(int sc, java.lang.String msg)
用于發送表示錯誤信息的狀態碼(如404,找不到資源)。msg用于提示說有出錯的原因,該文本信息將出現在發送給客戶端的正文本內容中,注,該消息不是用來替換HTTP響應狀態行中提示信息的,它只是出現在實體部分。
response.sendError(405,"xxxxx"); 返回的響應狀態行如下:
HTTP/1.1 405Method Not Allowed
構建響應消息頭addHeader與setHeaderhttp://www.ietf.org/rfc/rfc2047.txt
addHeader(java.lang.String name, java.lang.String value)
setHeader(java.lang.String name, java.lang.String value)
如果已經設置過同名的響應并沒有,setHeader方法將用新的設置值取代原來的設置值,而addHeader方法則是增加一個同名的響應頭。HTTP響應消息中允許同一名稱的頭字段出現多次。
addIntHeader與setIntHeaderaddIntHeader(java.lang.String name, int value)
setIntHeader(java.lang.String name, int value)
與addHeader與setHeader不同的是它們傳進的值可以直接是一個整數值。一般很少用這兩個方法,使用前面兩個完全一樣。
response.setHeader("Refresh", "2"); 響應頭加上了Refresh頭如下:
Refresh: 2
注,頭的值一般不會使用雙引號引起來的。
addDateHeader與setDateHeaderaddDateHeader(java.lang.String name, long date)
setDateHeader(java.lang.String name, long date)
這兩個方法專門用于設置包含日期值的響應頭的方法。HTTP響應頭中的日期通常都是GMT格式。它們避免了將毫秒數轉換成GMT格式時間的麻煩。
setContentLengthsetContentLength(int len)
setContentLength方法用于設置響應消息的實體內容的大小,單位為字節。對于HTTP協議來說,這個方法就是設置Content-Length響應頭字段的值。因為瀏覽器與Web服務器之間使用持久(Keep-alive的HTTP連接,如果Web服務器沒有采用chunked傳輸編碼方式,那么它必須在每個應答中發送一個Content-Length的響應頭來表示各個實體內容的長度,以便客戶端能夠分辨出上一個響應內容的結束位置。一般來說,Setvlet程序不必調用setContentLength方法來設置Content-Length頭字段,因為Servlet引擎在向客戶端實際輸出響應內容時,它可以自動設置Content-Length頭字段或采用chunked傳輸編碼方式。
setContentType設置響應實體的MIME類型,即對Content-Type頭的設置。如響應的實體為jpeg圖片,則需要將響應內容的類型設置為“image/jpeg”;如果是xml,則要設置為“text/xml”。
頁網的類型通常是“text/html”,所以如果以是Servlet程序的方式輸出網頁內容,則需要顯試地調用setContentType方法來指定,否則響應頭中不存在Content-Type并沒有,那么瀏覽器會將內容以“text/plain”內型來解釋,即以原文本的形式展示。當然如果請求的資源不是Servlet,比如是xx.html,則Web容器會根據你請求的資源的文件的擴展外來在conf/web.xml找相應的已配置的MIME類型,然后自動加上這個頭信息,并設置成相應的MIME類型。
在MIME類型后面還可以指定響應內容所使用的字符集類型,如,“text/html; charset=GB2312”,如果沒有指定,在Tomcat5.x產生的響應頭的MIME類型后默認為ISO8859-1的字符集編碼,而Tocmat4.x將不會自動加上。
注,一般charset全小寫,但有的廠商是charSet
setCharacterEncodingsetCharacterEncoding是在2.4規范中新增的方法。用于設置輸出內容的MIME聲明中的字符集編碼,對于HTTP來說,即設置Content-Type頭字段中的字符集編碼部分。
注,如果沒有設置Content-Type頭字段,該方法的設置的編碼不會出現在響應頭中(因為實體內容的編碼方式只能存放在在Content-Type的后部分),但是它的設置結果仍然決定了輸出內容的編碼方式(即直接使用out內置對象輸出字符串時會采用該方法設置的編碼方式,當然如果使用的是response.getOutputStream時,就談不上編碼方式了,因為OutputStream輸出不涉及到流)。另外,該方法的比setContentType和setLocale方法的優先權高,它的設置會覆蓋這兩個方法所設置的字符集編碼。
setLocalesetLocale(java.util.Locale loc)
用于設置響應消息的本地化信息,對HTTP來說,它將設置Content-Language響應頭和Content-Type頭中的字符集編碼部分。如果沒有設置Content-Type頭,該方法設置的字符集不會出現在響應頭中(因為實體內容的編碼方式只能存放在在Content-Type的后部分),但是它的設置仍然決定了輸出內容的編碼方式(即直接使用out內置對象輸出字符串時會采用該方法設置的編碼方式,當然如果使用的是response.getOutputStream時,就談不上編碼方式了,因為OutputStream輸出不涉及到流)。
注,如果調用了setCharacterEncoding或setContentType方法已指定了響應內容的字符集,則該方法將不再起效。
由于Local對象中只包含了語言和國家的地區信息,并沒有包含字符集編碼的信息,所以需要在web.xml中來配置:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>zh_CN</locale>
<encoding>GB2312</encoding>
</locale-encoding-mapping>
</locale-encoding-mapping-list>
containsHeaderboolean containsHeader(java.lang.String name)
containsHeader用于檢查某個名稱的頭是否已經被設置
響應頭的應用讓瀏覽器定時刷新網頁或跳轉到其他頁面// response.setHeader("Refresh", "2");
response.setHeader("Refresh", "2;URL=ServletContextTest");
// response.setHeader("Refresh","2;URL=http://localhost:8080/myapp/ServletContextTest");
禁止瀏覽器緩存當前文檔內容有三個HTTP響應頭可以禁止瀏覽器緩存當前頁面:
response.setDateHeader("Expires", 0);
response.setHeader(" response.setHeader("Cache-Control","no-cache"); 不是所有的瀏覽器都能完全支持上面的三個響應頭,因此最好是同時使用上面的三個響應頭,只要瀏覽器能支持其中任何一種形式,就能禁止緩存頁面。 上面我們是通過response內置對象來設置響應頭的,這只能在Servlet與jsp里使用,如果編寫的是靜態的html時,我們如果要設置響應消息頭,則只能借助于html標簽<meta>的http-equiv屬性來實現。 <meta http-equiv="Expires"content="0"> <meta http-equiv="Pragma"content="no-cache"> <meta http-equiv="Cache-Control"content="no-cache"> 在靜態的HTML里我們一般顯示地設置頁面的編碼方式: <meta http-equiv="Content-Type"content="text/html; charset=GB2312"> 注,如果在Servlet或Jsp頁面里使用了<meta>來設置編碼方式,而又使用也服務器端的設置方式,則以服務器方式的為準,也就是以響應頭里的Content-Type信息為準。 ServletOutputStreamgetOutputStream() throws java.io.IOException java.io.PrintWritergetWriter() throws java.io.IOException ServletOutputStream為OutputStream的子類。 getOutputStream返回的是字節流,不涉及到編碼 getWriter返回的是字符流,涉及編碼方式 這兩個方法互相排斥,調用了其中任何一個方法后,就不能再調用另一方法。在Servlet里寫以下兩行: Word
新聞熱點
疑難解答