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