HttpServletResponse 接口繼承自 ServletResponse 接口,主要用于封裝 HTTP 響應(yīng)消息。由于 HTTP 響應(yīng)消息分為狀態(tài)行、響應(yīng)消息頭、消息體三部分。因此,在 HttpServletResponse 接口中定義了向客戶端發(fā)送響應(yīng)狀態(tài)碼、響應(yīng)消息頭、響應(yīng)消息體的方法,本節(jié)將針對(duì)這些方法進(jìn)行詳細(xì)講解。
當(dāng) Servlet 向客戶端回送響應(yīng)消息時(shí),需要在響應(yīng)消息中設(shè)置狀態(tài)碼。因此,HttpServletResponse 接口定義了兩個(gè)發(fā)送狀態(tài)碼的方法。
該方法用于設(shè)置 HTTP 響應(yīng)消息的狀態(tài)碼,并生成響應(yīng)狀態(tài)行。由于響應(yīng)狀態(tài)行中的狀態(tài)描述信息直接與狀態(tài)碼相關(guān),而 HTTP 版本由服務(wù)器確定,因此,只要通過(guò) setStatus(int status)方法設(shè)置了狀態(tài)碼,即可實(shí)現(xiàn)狀態(tài)行的發(fā)送。需要注意的是,在正常情況下,Web 服務(wù)器會(huì)默認(rèn)產(chǎn)生一個(gè)狀態(tài)碼為 200 的狀態(tài)行。
該方法用于發(fā)送表示錯(cuò)誤信息的狀態(tài)碼。例如,404 狀態(tài)碼表示找不到客戶端請(qǐng)求的資源。response 對(duì)象提供了兩個(gè)重載的 sendError(int sc)方法,具體如下:
public void sendError(int code) throws java.io.IOException
public void sendError(int code,String message)throws java.io.IOException
在上面重載的兩個(gè)方法中,第一個(gè)方法只發(fā)送錯(cuò)誤信息的狀態(tài)碼,而第二個(gè)方法除了發(fā)送狀態(tài)碼以外,還可以增加一條用于提示說(shuō)明的文本信息,該文本信息將出現(xiàn)在發(fā)送給客戶端的正文內(nèi)容中。
Servlet 向客戶端發(fā)送的響應(yīng)消息中包含響應(yīng)頭字段,由于 HTTP 協(xié)議的響應(yīng)頭字段有很多種,因此,HttpServletResponse 接口定義了一系列設(shè)置 HTTP 響應(yīng)頭字段的方法,如表 2 所示。
表 1 設(shè)置響應(yīng)消息頭字段的方法
方法聲明 |
功能描述 |
---|---|
void addHeader(String name,String value) |
這兩個(gè)方法都是用于設(shè)置 HTTP 協(xié)議的響應(yīng)頭字段。其中,參數(shù) name 用于指定響應(yīng)頭字段的名稱,參數(shù) value 用于指定響 應(yīng)頭字段的值。不同的是,addHeader() 方法可以增加同名的響應(yīng)頭字段,而 setHeader() 方法則會(huì)覆蓋同名的頭字段 |
void setHeader (String name,String value) |
|
void addIntHeader(String name,int value) |
void addIntHeader(String name,int value)這兩個(gè)方法專門用于設(shè)置包含整數(shù)值的響應(yīng)頭,避免了使用 addHeader() 與 setHeader() 方法時(shí)需要將 int 類型的設(shè)置值轉(zhuǎn)換為 String 類型的麻煩 |
void setIntHeader(String name, int value) |
|
void setContentType(String type) |
void setContentType(String type)該方法用于設(shè)置 Servlet 輸出內(nèi)容的 MIME 類型,對(duì)于 HTTP 協(xié)議來(lái)說(shuō),就是設(shè)置 Content-Type 響應(yīng)頭字段的值。例如,如果發(fā)送到客戶端的內(nèi)容是 jpeg 格式的圖像數(shù)據(jù),就需要將響應(yīng)頭字段的類型設(shè)置為 image/jpeg。需要注意的是,如果響應(yīng)的內(nèi)容為文本,setContentType() 方法還可以設(shè)置字符編碼,如 text/html;charset = UTF-8 |
void setLocale (Locale loc) |
該方法用于設(shè)置響應(yīng)消息的本地化信息。對(duì) HTTP 來(lái)說(shuō),就是設(shè)置 Content-Language 響應(yīng)頭字段和 Content-Type 頭字段中的字符集編碼部分。需要注意的是,如果 HTTP 消息沒有設(shè)置 Content-Type 頭字段,則 setLocale() 方法設(shè)置的字符集編碼不會(huì)出現(xiàn)在 HTTP 消息的響應(yīng)頭中,如果調(diào)用 setCharacterEncoding() 或 setContentType() 方法指定了響應(yīng)內(nèi) 容的字符集編碼,則 setLocale() 方法將不再具有指定字符集編碼的功能 |
void setCharacterEncoding(String charset) |
該方法用于設(shè)置輸出內(nèi)容使用的字符編碼,對(duì) HTTP 協(xié)議來(lái)說(shuō),就是設(shè)置 Content-Type 頭字段中的字符集編碼部分。如果沒有設(shè)置 Content-Type 頭字段,則 setCharacterEncoding 方法設(shè) 置的字符集編碼不會(huì)出現(xiàn)在 HTTP 消息的響應(yīng)頭中。setCharacterEncoding() 方法比 setContentType() 和 setLocale() 方法的優(yōu)先權(quán)高,它的設(shè)置結(jié)果將覆蓋 setContentType() 和 setLocale() 方法所設(shè)置的字符碼表 |
需要注意的是,在表 1 列舉的一系列方法中,addHeader()、setHeader()、addIntHeader()、setIntHeader() 方法都用于設(shè)置各種頭字段,而 setContetType()、setLoacale() 和 setCharacterEncoding() 方法用于設(shè)置字符編碼,這些設(shè)置字符編碼的方法可以有效解決亂碼問(wèn)題。
由于在 HTTP 響應(yīng)消息中,大量的數(shù)據(jù)都是通過(guò)響應(yīng)消息體傳遞的,因此,ServletResponse 遵循以 I/O 流傳遞大量數(shù)據(jù)的設(shè)計(jì)理念。在發(fā)送響應(yīng)消息體時(shí),定義了兩個(gè)與輸出流相關(guān)的方法。
該方法所獲取的字節(jié)輸出流對(duì)象為 ServletOutputStream 類型。由于 ServletOutputStream是OutputStream 的子類,它可以直接輸出字節(jié)數(shù)組中的二進(jìn)制數(shù)據(jù)。因此,要想輸出二進(jìn)制格式的響應(yīng)正文,就需要使用 getOutputStream() 方法。
該方法所獲取的字符輸出流對(duì)象為 PrintWriter 類型。由于 PrintWriter 類型的對(duì)象可以直接輸出字符文本內(nèi)容,因此,要想輸出內(nèi)容全部為字符文本的網(wǎng)頁(yè)文檔,則需要使用 getWriter() 方法。
注意:雖然 response 對(duì)象的 getOutputStream() 和 getWriter() 方法都可以發(fā)送響應(yīng)消息體,但是,它們之間互相排斥,不可同時(shí)使用,否則會(huì)發(fā)生 IllegalStateException 異常。