關於本篇文章
瞭解一些 servlet 概念,本編文章只進行一些文章格式修改,文章內使用的圖片均來自 Runoob 網站
致謝
感謝 Runoob 提供的相關資料,官方資料地址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 編程中頻繁地使用它們:
頭信息 | 描述 |
---|---|
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.runoob.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 並稍等片刻,即可看到如下的結果: