# Servlet 服務器 HTTP 響應
正如前面的章節中討論的那樣,當一個 Web 服務器響應一個 HTTP 請求時,響應通常包括一個狀態行、一些響應報頭、一個空行和文檔。一個典型的響應如下所示:
```
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
```
狀態行包括 HTTP 版本(在本例中為 HTTP/1.1)、一個狀態碼(在本例中為 200)和一個對應于狀態碼的短消息(在本例中為 OK)。
下表總結了從 Web 服務器端返回到瀏覽器的最有用的 HTTP 1.1 響應報頭,您會在 Web 編程中頻繁地使用它們:
| 頭信息 | 描述 |
| --- | --- |
| Allow | 這個頭信息指定服務器支持的請求方法(GET、POST 等)。 |
| Cache-Control | 這個頭信息指定響應文檔在何種情況下可以安全地緩存。可能的值有:**public、private** 或 **no-cache** 等。Public 意味著文檔是可緩存,Private 意味著文檔是單個用戶私用文檔,且只能存儲在私有(非共享)緩存中,no-cache 意味著文檔不應被緩存。 |
| Connection | 這個頭信息指示瀏覽器是否使用持久 HTTP 連接。值 **close** 指示瀏覽器不使用持久 HTTP 連接,值 **keep-alive** 意味著使用持久連接。 |
| Content-Disposition | 這個頭信息可以讓您請求瀏覽器要求用戶以給定名稱的文件把響應保存到磁盤。 |
| Content-Encoding | 在傳輸過程中,這個頭信息指定頁面的編碼方式。 |
| Content-Language | 這個頭信息表示文檔編寫所使用的語言。例如,en、en-us、ru 等。 |
| Content-Length | 這個頭信息指示響應中的字節數。只有當瀏覽器使用持久(keep-alive)HTTP 連接時才需要這些信息。 |
| Content-Type | 這個頭信息提供了響應文檔的 MIME(Multipurpose Internet Mail Extension)類型。 |
| Expires | 這個頭信息指定內容過期的時間,在這之后內容不再被緩存。 |
| Last-Modified | 這個頭信息指示文檔的最后修改時間。然后,客戶端可以緩存文件,并在以后的請求中通過 **If-Modified-Since** 請求頭信息提供一個日期。 |
| Location | 這個頭信息應被包含在所有的帶有狀態碼的響應中。在 300s 內,這會通知瀏覽器文檔的地址。瀏覽器會自動重新連接到這個位置,并獲取新的文檔。 |
| Refresh | 這個頭信息指定瀏覽器應該如何盡快請求更新的頁面。您可以指定頁面刷新的秒數。 |
| Retry-After | 這個頭信息可以與 503(Service Unavailable 服務不可用)響應配合使用,這會告訴客戶端多久就可以重復它的請求。 |
| Set-Cookie | 個頭信息指定一個與頁面關聯的 cookie。 |
## 設置 HTTP 響應報頭的方法
下面的方法可用于在 Servlet 程序中設置 HTTP 響應報頭。這些方法通過 _HttpServletResponse_ 對象可用。
| 方法 | 描述 |
| --- | --- |
| **String encodeRedirectURL(String url)** | 為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| **String encodeURL(String url)** | 對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| **boolean containsHeader(String name)** | 返回一個布爾值,指示是否已經設置已命名的響應報頭。 |
| **boolean isCommitted()** | 返回一個布爾值,指示響應是否已經提交。 |
| **void addCookie(Cookie cookie)** | 把指定的 cookie 添加到響應。 |
| **void addDateHeader(String name, long date)** | 添加一個帶有給定的名稱和日期值的響應報頭。 |
| **void addHeader(String name, String value)** | 添加一個帶有給定的名稱和值的響應報頭。 |
| **void addIntHeader(String name, int value)** | 添加一個帶有給定的名稱和整數值的響應報頭。 |
| **void flushBuffer()** | 強制任何在緩沖區中的內容被寫入到客戶端。 |
| **void reset()** | 清除緩沖區中存在的任何數據,包括狀態碼和頭。 |
| **void resetBuffer()** | 清除響應中基礎緩沖區的內容,不清除狀態碼和頭。 |
| **void sendError(int sc)** | 使用指定的狀態碼發送錯誤響應到客戶端,并清除緩沖區。 |
| **void sendError(int sc, String msg)** | 使用指定的狀態發送錯誤響應到客戶端。 |
| **void sendRedirect(String location)** | 使用指定的重定向位置 URL 發送臨時重定向響應到客戶端。 |
| **void setBufferSize(int size)** | 為響應主體設置首選的緩沖區大小。 |
| **void setCharacterEncoding(String charset)** | 設置被發送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。 |
| **void setContentLength(int len)** | 設置在 HTTP Servlet 響應中的內容主體的長度,該方法設置 HTTP Content-Length 頭。 |
| **void setContentType(String type)** | 如果響應還未被提交,設置被發送到客戶端的響應的內容類型。 |
| **void setDateHeader(String name, long date)** | 設置一個帶有給定的名稱和日期值的響應報頭。 |
| **void setHeader(String name, String value)** | 設置一個帶有給定的名稱和值的響應報頭。 |
| **void setIntHeader(String name, int value)** | 設置一個帶有給定的名稱和整數值的響應報頭。 |
| **void setLocale(Locale loc)** | 如果響應還未被提交,設置響應的區域。 |
| **void setStatus(int sc)** | 為該響應設置狀態碼。 |
## HTTP Header 響應實例
您已經在前面的實例中看到 setContentType() 方法,下面的實例也使用了同樣的方法,此外,我們會用 **setIntHeader()** 方法來設置 **Refresh** 頭。
```
// 導入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// 擴展 HttpServlet 類
public class Refresh extends HttpServlet {
// 處理 GET 方法請求的方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 設置刷新自動加載時間為 5 秒
response.setIntHeader("Refresh", 5);
// 設置響應內容類型
response.setContentType("text/html");
// Get current time
Calendar calendar = new GregorianCalendar();
String am_pm;
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);
if(calendar.get(Calendar.AM_PM) == 0)
am_pm = "AM";
else
am_pm = "PM";
String CT = hour+":"+ minute +":"+ second +" "+ am_pm;
PrintWriter out = response.getWriter();
String title = "自動刷新 Header 設置";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n"+
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<p>當前時間是:" + CT + "</p>\n");
}
// 處理 POST 方法請求的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
```
現在,調用上面的 Servlet,每隔 5 秒會顯示當前系統時間。只要運行 Servlet 并稍等片刻,即可看到如下的結果:
```
<h1>自動刷新 Header 設置</h1>
當前時間是:9:44:50 PM
```
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明