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