# 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*對象可用。
| 序號 | 方法 & 描述 |
| --- | --- |
| 1 | **String encodeRedirectURL(String url)**
為 sendRedirect 方法中使用的指定的 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| 2 | **String encodeURL(String url)**
對包含 session 會話 ID 的指定 URL 進行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
| 3 | **boolean containsHeader(String name)**
返回一個布爾值,指示是否已經設置已命名的響應報頭。 |
| 4 | **boolean isCommitted()**
返回一個布爾值,指示響應是否已經提交。 |
| 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)**
添加一個帶有給定的名稱和整數值的響應報頭。 |
| 9 | **void flushBuffer()**
強制任何在緩沖區中的內容被寫入到客戶端。 |
| 10 | **void reset()**
清除緩沖區中存在的任何數據,包括狀態碼和頭。 |
| 11 | **void resetBuffer()**
清除響應中基礎緩沖區的內容,不清除狀態碼和頭。 |
| 12 | **void sendError(int sc)**
使用指定的狀態碼發送錯誤響應到客戶端,并清除緩沖區。 |
| 13 | **void sendError(int sc, String msg)**
使用指定的狀態發送錯誤響應到客戶端。 |
| 14 | **void sendRedirect(String location)**
使用指定的重定向位置 URL 發送臨時重定向響應到客戶端。 |
| 15 | **void setBufferSize(int size)**
為響應主體設置首選的緩沖區大小。 |
| 16 | **void setCharacterEncoding(String charset)**
設置被發送到客戶端的響應的字符編碼(MIME 字符集)例如,UTF-8。 |
| 17 | **void setContentLength(int len)**
設置在 HTTP Servlet 響應中的內容主體的長度,該方法設置 HTTP Content-Length 頭。 |
| 18 | **void setContentType(String type)**
如果響應還未被提交,設置被發送到客戶端的響應的內容類型。 |
| 19 | **void setDateHeader(String name, long date)**
設置一個帶有給定的名稱和日期值的響應報頭。 |
| 20 | **void setHeader(String name, String value)**
設置一個帶有給定的名稱和值的響應報頭。 |
| 21 | **void setIntHeader(String name, int value)**
設置一個帶有給定的名稱和整數值的響應報頭。 |
| 22 | **void setLocale(Locale loc)**
如果響應還未被提交,設置響應的區域。 |
| 23 | **void setStatus(int sc)**
為該響應設置狀態碼。 |
## HTTP Header 響應實例
您已經在前面的實例中看到 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");
????
???? //使用默認時區和語言環境獲得一個日歷
???? 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.yiniuedu.test.Refresh</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Refresh</servlet-name>
<!-- 訪問的網址 -->
<url-pattern>/TomcatTest/Refresh</url-pattern>
</servlet-mapping>
</web-app>
~~~
現在,調用上面的 Servlet,每隔 5 秒會顯示當前系統時間。只要運行 Servlet 并稍等片刻,即可看到如下的結果:

- Java Web項目開發學習手冊
- 一、B/S開發環境搭建
- 1.1 tomcat服務器目錄結構及作用
- 1.2 在IDE開發工具上配置tomcat服務器
- 1.3 簡單web項目在tomcat服務器上運行的方法
- 1.4 開發工具設置
- 1.5 總結
- 二、Servlet技術應用
- 2.1 HttpServlet中的主要方法及應用
- 2.1.1 基于Eclipse完成一個JavaWeb項目
- 2.2 HttpRequest,HttpResponse的應用
- 2.2.1客戶端請求
- 2.2.2服務器響應
- 2.2.3Servlet HTTP 狀態碼
- 2.2.4圖片驗證碼類
- 2.2.5注冊模擬實現(帶驗證碼)
- 2.3 ServletConfig對象和ServletContext對象的概念
- 2.4 總結
- 三、JSP技術應用
- 3.1 JSP基本語法
- 3.2 JSP標簽和指令
- 3.3 JSP中的隱式對象
- 3.4 常用應用操作
- 3.4.1 JSP客戶端請求
- 3.4.2 JSP服務器響應
- 3.4.3 HTTP狀態碼
- 3.4.4 表單處理
- 3.4.5 過濾器
- 3.4.6 Cookie處理
- 3.4.7 Session處理
- 3.4.8 文件上傳
- 3.4.9 日期處理
- 3.4.10 頁面重定向
- 3.4.11 點擊量統計
- 3.4.12 自動刷新
- 3.4.13 發送郵件
- 3.5 JSP高級應用
- 3.5.1 JSP標準標簽庫(JSTL)
- 3.5.2 JSP連接數據庫
- 3.5.3 JSP XML數據處理
- 3.5.4 JSP JavaBean
- 3.5.5 自定義標簽
- 3.5.6 表達式語言
- 3.5.7 異常處理
- 3.5.8 調試
- 3.5.9 JSP國際化
- 3.6 實踐代碼
- 3.6.1 實踐代碼
- 3.6.2 項目實戰
- 3.7 總結
- 四、MVC思想的理解和搭建MVC
- 4.1 MVC設計模式的思想
- 4.2 MVC設計模式的實現步驟
- 4.3 項目實踐
- 4.4 總結
- 五、EL表達式和JSTL技術
- 5.1 EL表達式及其應用
- 5.2 常用的JSTL標簽的應用
- 5.3 項目實踐
- 5.4 總結
- 六、Cookie和Session
- 6.1 cookie對象的概念和應用
- 6.2 session對象的概念和應用
- 6.3 項目實踐
- 6.4 總結
- 七、過濾器技術應用
- 7.1 Filter的概念及應用
- 7.2 Filter、FilterChain、FilterConfig 介紹
- 7.3 用戶登錄過濾案例
- 7.4 項目實戰
- 7.5總結
- 八、異步請求技術
- 8.1 JSON數據格式
- 8.2 使用AJAX實現異步請求
- 8.3 用戶名校驗案例
- 8.4小結
- 綜合項目技術實訓
- 1.BS項目開發項目實戰
- 2.項目需求分析和系統設計
- 2.1需求分析
- 2.2類型模型設計
- 2.3原型設計
- 3.項目數據庫分析和系統設計
- 4.BS項目編程實現
- 4.1搭建框架和命名規約
- 4.2實現步驟
- 4.2.1創建實體類
- 4.2.2創建過濾器類
- 4.2.3創建工具類
- 4.2.4創建DAO接口及其實現類
- 4.2.5創建Service接口及其實現類
- 4.2.6創建測試類
- 4.2.7創建控制器類
- 5.企業開發流程規范
- 6.總結
- 九、練習題及答案
- 企業開發常用技術
- 1.Maven技術
- Java命名規范解讀
- 參考資料
- 開發中常用的應用服務器和Web服務器