正如前面的章節(jié)中討論的那樣,當(dāng)一個(gè) Web 服務(wù)器響應(yīng)一個(gè) HTTP 請(qǐng)求時(shí),響應(yīng)通常包括一個(gè)狀態(tài)行、一些響應(yīng)報(bào)頭、一個(gè)空行和文檔。一個(gè)典型的響應(yīng)如下所示:
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)、一個(gè)狀態(tài)碼(在本例中為 200)和一個(gè)對(duì)應(yīng)于狀態(tài)碼的短消息(在本例中為 OK)。
下表總結(jié)了從 Web 服務(wù)器端返回到瀏覽器的最有用的 HTTP 1.1 響應(yīng)報(bào)頭,您會(huì)在 Web 編程中頻繁地使用它們:
頭信息 | 描述 |
---|---|
Allow | 這個(gè)頭信息指定服務(wù)器支持的請(qǐng)求方法(GET、POST 等)。 |
Cache-Control | 這個(gè)頭信息指定響應(yīng)文檔在何種情況下可以安全地緩存??赡艿闹涤校?b>public、private 或 no-cache 等。Public 意味著文檔是可緩存,Private 意味著文檔是單個(gè)用戶私用文檔,且只能存儲(chǔ)在私有(非共享)緩存中,no-cache 意味著文檔不應(yīng)被緩存。 |
Connection | 這個(gè)頭信息指示瀏覽器是否使用持久 HTTP 連接。值 close 指示瀏覽器不使用持久 HTTP 連接,值 keep-alive 意味著使用持久連接。 |
Content-Disposition | 這個(gè)頭信息可以讓您請(qǐng)求瀏覽器要求用戶以給定名稱(chēng)的文件把響應(yīng)保存到磁盤(pán)。 |
Content-Encoding | 在傳輸過(guò)程中,這個(gè)頭信息指定頁(yè)面的編碼方式。 |
Content-Language | 這個(gè)頭信息表示文檔編寫(xiě)所使用的語(yǔ)言。例如,en、en-us、ru 等。 |
Content-Length | 這個(gè)頭信息指示響應(yīng)中的字節(jié)數(shù)。只有當(dāng)瀏覽器使用持久(keep-alive)HTTP 連接時(shí)才需要這些信息。 |
Content-Type | 這個(gè)頭信息提供了響應(yīng)文檔的 MIME(Multipurpose Internet Mail Extension)類(lèi)型。 |
Expires | 這個(gè)頭信息指定內(nèi)容過(guò)期的時(shí)間,在這之后內(nèi)容不再被緩存。 |
Last-Modified | 這個(gè)頭信息指示文檔的最后修改時(shí)間。然后,客戶端可以緩存文件,并在以后的請(qǐng)求中通過(guò) If-Modified-Since 請(qǐng)求頭信息提供一個(gè)日期。 |
Location | 這個(gè)頭信息應(yīng)被包含在所有的帶有狀態(tài)碼的響應(yīng)中。在 300s 內(nèi),這會(huì)通知瀏覽器文檔的地址。瀏覽器會(huì)自動(dòng)重新連接到這個(gè)位置,并獲取新的文檔。 |
Refresh | 這個(gè)頭信息指定瀏覽器應(yīng)該如何盡快請(qǐng)求更新的頁(yè)面。您可以指定頁(yè)面刷新的秒數(shù)。 |
Retry-After | 這個(gè)頭信息可以與 503(Service Unavailable 服務(wù)不可用)響應(yīng)配合使用,這會(huì)告訴客戶端多久就可以重復(fù)它的請(qǐng)求。 |
Set-Cookie | 這個(gè)頭信息指定一個(gè)與頁(yè)面關(guān)聯(lián)的 cookie。 |
下面的方法可用于在 Servlet 程序中設(shè)置 HTTP 響應(yīng)報(bào)頭。這些方法通過(guò) HttpServletResponse 對(duì)象可用。
序號(hào) | 方法 & 描述 |
---|---|
1 | String encodeRedirectURL(String url) 為 sendRedirect 方法中使用的指定的 URL 進(jìn)行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
2 | String encodeURL(String url) 對(duì)包含 session 會(huì)話 ID 的指定 URL 進(jìn)行編碼,或者如果編碼不是必需的,則返回 URL 未改變。 |
3 | boolean containsHeader(String name) 返回一個(gè)布爾值,指示是否已經(jīng)設(shè)置已命名的響應(yīng)報(bào)頭。 |
4 | boolean isCommitted() 返回一個(gè)布爾值,指示響應(yīng)是否已經(jīng)提交。 |
5 | void addCookie(Cookie cookie) 把指定的 cookie 添加到響應(yīng)。 |
6 | void addDateHeader(String name, long date) 添加一個(gè)帶有給定的名稱(chēng)和日期值的響應(yīng)報(bào)頭。 |
7 | void addHeader(String name, String value) 添加一個(gè)帶有給定的名稱(chēng)和值的響應(yīng)報(bào)頭。 |
8 | void addIntHeader(String name, int value) 添加一個(gè)帶有給定的名稱(chēng)和整數(shù)值的響應(yīng)報(bào)頭。 |
9 | void flushBuffer() 強(qiáng)制任何在緩沖區(qū)中的內(nèi)容被寫(xiě)入到客戶端。 |
10 | void reset() 清除緩沖區(qū)中存在的任何數(shù)據(jù),包括狀態(tài)碼和頭。 |
11 | void resetBuffer() 清除響應(yīng)中基礎(chǔ)緩沖區(qū)的內(nèi)容,不清除狀態(tài)碼和頭。 |
12 | void sendError(int sc) 使用指定的狀態(tài)碼發(fā)送錯(cuò)誤響應(yīng)到客戶端,并清除緩沖區(qū)。 |
13 | void sendError(int sc, String msg) 使用指定的狀態(tài)發(fā)送錯(cuò)誤響應(yīng)到客戶端。 |
14 | void sendRedirect(String location) 使用指定的重定向位置 URL 發(fā)送臨時(shí)重定向響應(yīng)到客戶端。 |
15 | void setBufferSize(int size) 為響應(yīng)主體設(shè)置首選的緩沖區(qū)大小。 |
16 | void setCharacterEncoding(String charset) 設(shè)置被發(fā)送到客戶端的響應(yīng)的字符編碼(MIME 字符集)例如,UTF-8。 |
17 | void setContentLength(int len) 設(shè)置在 HTTP Servlet 響應(yīng)中的內(nèi)容主體的長(zhǎng)度,該方法設(shè)置 HTTP Content-Length 頭。 |
18 | void setContentType(String type) 如果響應(yīng)還未被提交,設(shè)置被發(fā)送到客戶端的響應(yīng)的內(nèi)容類(lèi)型。 |
19 | void setDateHeader(String name, long date) 設(shè)置一個(gè)帶有給定的名稱(chēng)和日期值的響應(yīng)報(bào)頭。 |
20 | void setHeader(String name, String value) 設(shè)置一個(gè)帶有給定的名稱(chēng)和值的響應(yīng)報(bào)頭。 |
21 | void setIntHeader(String name, int value) 設(shè)置一個(gè)帶有給定的名稱(chēng)和整數(shù)值的響應(yīng)報(bào)頭。 |
22 | void setLocale(Locale loc) 如果響應(yīng)還未被提交,設(shè)置響應(yīng)的區(qū)域。 |
23 | void setStatus(int sc) 為該響應(yīng)設(shè)置狀態(tài)碼。 |
您已經(jīng)在前面的實(shí)例中看到 setContentType() 方法,下面的實(shí)例也使用了同樣的方法,此外,我們會(huì)用 setIntHeader() 方法來(lái)設(shè)置 Refresh 頭。
// 導(dǎo)入必需的 java 庫(kù)
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// 擴(kuò)展 HttpServlet 類(lèi)
public class Refresh extends HttpServlet {
// 處理 GET 方法請(qǐng)求的方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 設(shè)置刷新自動(dòng)加載時(shí)間為 5 秒
response.setIntHeader("Refresh", 5);
// 設(shè)置響應(yīng)內(nèi)容類(lèi)型
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 = "自動(dòng)刷新 Header 設(shè)置";
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>當(dāng)前時(shí)間是:" + CT + "</p>\n");
}
// 處理 POST 方法請(qǐng)求的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
現(xiàn)在,調(diào)用上面的 Servlet,每隔 5 秒會(huì)顯示當(dāng)前系統(tǒng)時(shí)間。只要運(yùn)行 Servlet 并稍等片刻,即可看到如下的結(jié)果:
自動(dòng)刷新 Header 設(shè)置當(dāng)前時(shí)間是:9:44:50 PM |
更多建議: