- Servlet 教程
- Servlet - 首頁
- Servlet - 概述
- Servlet - 環境設定
- Servlet - 生命週期
- Servlet - 示例
- Servlet - 表單資料
- Servlet - 客戶端請求
- Servlet - 伺服器響應
- Servlet - HTTP 狀態碼
- Servlet - 編寫過濾器
- Servlet - 異常
- Servlet - 處理 Cookie
- Servlet - 會話跟蹤
- Servlet - 資料庫訪問
- Servlet - 檔案上傳
- Servlet - 處理日期
- Servlet - 頁面重定向
- Servlet - 訪問計數器
- Servlet - 自動重新整理
- Servlet - 傳送電子郵件
- Servlet - 打包
- Servlet - 除錯
- Servlet - 國際化
- Servlet - 註解
- Servlet 有用資源
- Servlet - 常見問題解答
- Servlet - 快速指南
- Servlet - 有用資源
- Servlet - 討論
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 程式設計中會經常用到它們:
| 序號 | 頭資訊及描述 |
|---|---|
| 1 | Allow 此標頭指定伺服器支援的請求方法(GET、POST 等)。 |
| 2 | Cache-Control 此標頭指定可以在哪些情況下安全地快取響應文件。它可以具有public、private或no-cache等值。Public 表示文件可快取,Private 表示文件僅供單個使用者使用,只能儲存在私有(非共享)快取中,而 nocache 表示文件永遠不應被快取。 |
| 3 | Connection 此標頭指示瀏覽器是否使用 HTTP 持久連線。值為close指示瀏覽器不使用 HTTP 持久連線,而keepalive表示使用持久連線。 |
| 4 | Content-Disposition 此標頭允許您請求瀏覽器要求使用者將響應儲存到磁碟中的給定名稱的檔案中。 |
| 5 | Content-Encoding 此標頭指定傳輸過程中頁面的編碼方式。 |
| 6 | Content-Language 此標頭表示文件的書寫語言。例如 en、en-us、ru 等 |
| 7 | Content-Length 此標頭指示響應中的位元組數。只有當瀏覽器使用持久(keep-alive)HTTP 連線時才需要此資訊。 |
| 8 | Content-Type 此標頭給出響應文件的 MIME(多用途網際網路郵件擴充套件)型別。 |
| 9 | Expires 此標頭指定內容應在何時被視為過期,因此不再被快取。 |
| 10 | Last-Modified 此標頭指示文件上次修改的時間。然後,客戶端可以快取文件並在以後的請求中透過If-Modified-Since請求頭提供日期。 |
| 11 | Location 此標頭應包含在所有狀態程式碼為 300 多的響應中。這會通知瀏覽器文件地址。瀏覽器會自動重新連線到此位置並檢索新文件。 |
| 12 | Refresh 此標頭指定瀏覽器應在多久後請求更新頁面。您可以指定頁面重新整理後的秒數。 |
| 13 | Retry-After 此標頭可以與 503(服務不可用)響應一起使用,以告訴客戶端它可以多久後重復其請求。 |
| 14 | Set-Cookie 此標頭指定與頁面關聯的 Cookie。 |
設定 HTTP 響應頭的方法
在您的 Servlet 程式中可以使用以下方法設定 HTTP 響應頭。這些方法可用於HttpServletResponse物件。
| 序號 | 方法及描述 |
|---|---|
| 1 | String encodeRedirectURL(String url) 對指定的 URL 進行編碼以在 sendRedirect 方法中使用,或者如果不需要編碼,則返回未更改的 URL。 |
| 2 | String encodeURL(String url) 透過在其中包含會話 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 標頭響應示例
您已經在前面的示例中看到了 setContentType() 方法的工作原理,下面的示例也將使用相同的方法,此外我們還將使用setIntHeader()方法設定Refresh標頭。
// Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// Extend HttpServlet class
public class Refresh extends HttpServlet {
// Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Set refresh, autoload time as 5 seconds
response.setIntHeader("Refresh", 5);
// Set response content type
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 = "Auto Refresh Header Setting";
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>Current Time is: " + CT + "</p>\n"
);
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
現在呼叫上述 Servlet 將每 5 秒顯示一次當前系統時間,如下所示。只需執行 Servlet 並等待檢視結果:
Auto Refresh Header Setting
Current Time is: 9:44:50 PM
