正如前面的章節(jié)中討論的那樣,當一個 Web 服務器響應一個 HTTP 請求時,響應通常包括一個狀態(tài)行、一些響應報頭、一個空行和文檔。一個典型的響應如下所示:
HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</head> <body> ... </body> </html>
狀態(tài)行包括 HTTP 版本(在本示例中為 HTTP/1.1)、一個狀態(tài)碼(在本示例中為 200)和一個對應于狀態(tài)碼的短消息(在本示例中為 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 | 這個頭信息指示響應中的字節(jié)數(shù)。只有當瀏覽器使用持久(keep-alive)HTTP 連接時才需要這些信息。 |
Content-Type | 這個頭信息提供了響應文檔的 MIME(Multipurpose Internet Mail Extension)類型。 |
Expires | 這個頭信息指定內容過期的時間,在這之后內容不再被緩存。 |
Last-Modified | 這個頭信息指示文檔的最后修改時間。然后,客戶端可以緩存文件,并在以后的請求中通過 If-Modified-Since 請求頭信息提供一個日期。 |
Location | 這個頭信息應被包含在所有的帶有狀態(tài)碼的響應中。在 300s 內,這會通知瀏覽器文檔的地址。瀏覽器會自動重新連接到這個位置,并獲取新的文檔。 |
Refresh | 這個頭信息指定瀏覽器應該如何盡快請求更新的頁面。您可以指定頁面刷新的秒數(shù)。 |
Retry-After | 這個頭信息可以與 503(Service Unavailable 服務不可用)響應配合使用,這會告訴客戶端多久就可以重復它的請求。 |
Set-Cookie | 這個頭信息指定一個與頁面關聯(lián)的 cookie。 |
下面的方法可用于在 Servlet 程序中設置 HTTP 響應報頭。這些方法通過 HttpServletResponse 對象可用。
序號 | 方法 & 描述 |
---|---|
1 | String encodeRedirectURL(String url) 為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
2 | String encodeURL(String url) 對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
3 | boolean containsHeader(String name) 返回一個布爾值,指示是否已經(jīng)設置已命名的響應報頭。 |
4 | boolean isCommitted() 返回一個布爾值,指示響應是否已經(jīng)提交。 |
5 | void addCookie(Cookie cookie) 把指定的 cookie 添加到響應。 |
6 | void addDateHeader(String name, long date) 添加一個帶有給定的名稱和日期值的響應報頭。 |
7 | void addHeader(String name, String value) 添加一個帶有給定的名稱和值的響應報頭。 |
8 | void addIntHeader(String name, int value) 添加一個帶有給定的名稱和整數(shù)值的響應報頭。 |
9 | void flushBuffer() 強制任何在緩沖區(qū)中的內容被寫入到客戶端。 |
10 | void reset() 清除緩沖區(qū)中存在的任何數(shù)據(jù),包括狀態(tài)碼和頭。 |
11 | void resetBuffer() 清除響應中基礎緩沖區(qū)的內容,不清除狀態(tài)碼和頭。 |
12 | void sendError(int sc) 使用指定的狀態(tài)碼發(fā)送錯誤響應到客戶端,并清除緩沖區(qū)。 |
13 | void sendError(int sc, String msg) 使用指定的狀態(tài)發(fā)送錯誤響應到客戶端。 |
14 | void sendRedirect(String location) 使用指定的重定向位置 URL 發(fā)送臨時重定向響應到客戶端。 |
15 | void setBufferSize(int size) 為響應主體設置首選的緩沖區(qū)大小。 |
16 | void setCharacterEncoding(String charset) 設置被發(fā)送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。 |
17 | void setContentLength(int len) 設置在 HTTP Servlet 響應中的內容主體的長度,該方法設置 HTTP Content-Length 頭。 |
18 | void setContentType(String type) 如果響應還未被提交,設置被發(fā)送到客戶端的響應的內容類型。 |
19 | void setDateHeader(String name, long date) 設置一個帶有給定的名稱和日期值的響應報頭。 |
20 | void setHeader(String name, String value) 設置一個帶有給定的名稱和值的響應報頭。 |
21 | void setIntHeader(String name, int value) 設置一個帶有給定的名稱和整數(shù)值的響應報頭。 |
22 | void setLocale(Locale loc) 如果響應還未被提交,設置響應的區(qū)域。 |
23 | void setStatus(int sc) 為該響應設置狀態(tài)碼。 |
您已經(jīng)在前面的示例中看到 setContentType() 方法,下面的示例也使用了同樣的方法,此外,我們會用 setIntHeader() 方法來設置 Refresh 頭。
//導入必需的 java 庫 import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/Refresh") //擴展 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;charset=UTF-8"); //使用默認時區(qū)和語言環(huán)境獲得一個日歷 Calendar cale = Calendar.getInstance(); //將Calendar類型轉換成Date類型 Date tasktime=cale.getTime(); //設置日期輸出的格式 SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化輸出 String nowTime = df.format(tasktime); PrintWriter out = response.getWriter(); String title = "自動刷新 Header 設置 - 菜鳥教程示例"; String docType = "<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n"+ "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n" + "<p>當前時間是:" + nowTime + "</p>\n"); } // 處理 POST 方法請求的方法 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
以上測試示例是位于 TomcatTest 項目下,對應的 web.xml 配置為:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <!-- 類名 --> <servlet-name>Refresh</servlet-name> <!-- 所在的包 --> <servlet-class>com.nhooo.test.Refresh</servlet-class> </servlet> <servlet-mapping> <servlet-name>Refresh</servlet-name> <!-- 訪問的網(wǎng)址 --> <url-pattern>/TomcatTest/Refresh</url-pattern> </servlet-mapping> </web-app>
現(xiàn)在,調用上面的 Servlet,每隔 5 秒會顯示當前系統(tǒng)時間。只要運行 Servlet 并稍等片刻,即可看到如下的結果: