jsp 服務(wù)器響應(yīng)
response響應(yīng)對(duì)象主要將jsp容器處理后的結(jié)果傳回到客戶端。可以通過response變量設(shè)置http的狀態(tài)和向客戶端發(fā)送數(shù)據(jù),如cookie、http文件頭信息等。
一個(gè)典型的響應(yīng)看起來就像下面這樣:
http/1.1 200 ok content-type: text/html header2: ... ... headern: ... (空行) <!doctype ...> <html> <head>...</head> <body> ... </body> </html>
狀態(tài)行包含http版本信息,比如http/1.1,一個(gè)狀態(tài)碼,比如200,還有一個(gè)非常短的信息對(duì)應(yīng)著狀態(tài)碼,比如ok。
下表摘要出了http1.1響應(yīng)頭中最有用的部分,在網(wǎng)絡(luò)編程中您將會(huì)經(jīng)常見到它們:
響應(yīng)頭 | 描述 |
---|---|
allow | 指定服務(wù)器支持的request方法(get,post等等) |
cache-control | 指定響應(yīng)文檔能夠被安全緩存的情況。通常取值為 public,private 或no-cache 等等。 public意味著文檔可緩存,private意味著文檔只為單用戶服務(wù)并且只能使用私有緩存。no-cache 意味著文檔不被緩存。 |
connection | 命令瀏覽器是否要使用持久的http連接。close值 命令瀏覽器不使用持久http連接,而keep-alive 意味著使用持久化連接。 |
content-disposition | 讓瀏覽器要求用戶將響應(yīng)以給定的名稱存儲(chǔ)在磁盤中 |
content-encoding | 指定傳輸時(shí)頁面的編碼規(guī)則 |
content-language | 表述文檔所使用的語言,比如en, en-us,,ru等等 |
content-length | 表明響應(yīng)的字節(jié)數(shù)。只有在瀏覽器使用持久化 (keep-alive) http 連接時(shí)才有用 |
content-type | 表明文檔使用的mime類型 |
expires | 指明啥時(shí)候過期并從緩存中移除 |
last-modified | 指明文檔最后修改時(shí)間。客戶端可以 緩存文檔并且在后續(xù)的請(qǐng)求中提供一個(gè) if-modified-since請(qǐng)求頭 |
location | 在300秒內(nèi),包含所有的有一個(gè)狀態(tài)碼的響應(yīng)地址,瀏覽器會(huì)自動(dòng)重連然后檢索新文檔 |
refresh | 指明瀏覽器每隔多久請(qǐng)求更新一次頁面。 |
retry-after | 與503 (service unavailable)一起使用來告訴用戶多久后請(qǐng)求將會(huì)得到響應(yīng) |
set-cookie | 指明當(dāng)前頁面對(duì)應(yīng)的cookie |
httpservletresponse類
response 對(duì)象是 javax.servlet.http.httpservletresponse 類的一個(gè)實(shí)例。就像服務(wù)器會(huì)創(chuàng)建request對(duì)象一樣,它也會(huì)創(chuàng)建一個(gè)客戶端響應(yīng)。
response對(duì)象定義了處理創(chuàng)建http信息頭的接口。通過使用這個(gè)對(duì)象,開發(fā)者們可以添加新的cookie或時(shí)間戳,還有http狀態(tài)碼等等。
下表列出了用來設(shè)置http響應(yīng)頭的方法,這些方法由httpservletresponse 類提供:
s.n. | 方法 & 描述 |
---|---|
1 | string encoderedirecturl(string url) 對(duì)sendredirect()方法使用的url進(jìn)行編碼 |
2 | string encodeurl(string url) 將url編碼,回傳包含session id的url |
3 | boolean containsheader(string name) 返回指定的響應(yīng)頭是否存在 |
4 | boolean iscommitted() 返回響應(yīng)是否已經(jīng)提交到客戶端 |
5 | void addcookie(cookie cookie) 添加指定的cookie至響應(yīng)中 |
6 | void adddateheader(string name, long date) 添加指定名稱的響應(yīng)頭和日期值 |
7 | void addheader(string name, string value) 添加指定名稱的響應(yīng)頭和值 |
8 | void addintheader(string name, int value) 添加指定名稱的響應(yīng)頭和int值 |
9 | void flushbuffer() 將任何緩存中的內(nèi)容寫入客戶端 |
10 | void reset() 清除任何緩存中的任何數(shù)據(jù),包括狀態(tài)碼和各種響應(yīng)頭 |
11 | void resetbuffer() 清除基本的緩存數(shù)據(jù),不包括響應(yīng)頭和狀態(tài)碼 |
12 | void senderror(int sc) 使用指定的狀態(tài)碼向客戶端發(fā)送一個(gè)出錯(cuò)響應(yīng),然后清除緩存 |
13 | void senderror(int sc, string msg) 使用指定的狀態(tài)碼和消息向客戶端發(fā)送一個(gè)出錯(cuò)響應(yīng) |
14 | void sendredirect(string location) 使用指定的url向客戶端發(fā)送一個(gè)臨時(shí)的間接響應(yīng) |
15 | void setbuffersize(int size) 設(shè)置響應(yīng)體的緩存區(qū)大小 |
16 | void setcharacterencoding(string charset) 指定響應(yīng)的編碼集(mime字符集),例如utf-8 |
17 | void setcontentlength(int len) 指定http servlets中響應(yīng)的內(nèi)容的長度,此方法用來設(shè)置 http content-length 信息頭 |
18 | void setcontenttype(string type) 設(shè)置響應(yīng)的內(nèi)容的類型,如果響應(yīng)還未被提交的話 |
19 | void setdateheader(string name, long date) 使用指定名稱和日期設(shè)置響應(yīng)頭的名稱和日期 |
20 | void setheader(string name, string value) 使用指定名稱和值設(shè)置響應(yīng)頭的名稱和內(nèi)容 |
21 | void setintheader(string name, int value) 指定 int 類型的值到 name 標(biāo)頭 |
22 | void setlocale(locale loc) 設(shè)置響應(yīng)的語言環(huán)境,如果響應(yīng)尚未被提交的話 |
23 | void setstatus(int sc) 設(shè)置響應(yīng)的狀態(tài)碼 |
http響應(yīng)頭程序示例
接下來的例子使用setintheader()方法和setrefreshheader()方法來模擬一個(gè)數(shù)字時(shí)鐘:
<%@ page language="java" contenttype="text/html; charset=utf-8" pageencoding="utf-8"%> <%@ page import="java.io.*,java.util.*" %> <!doctype html> <html> <head> <meta charset="utf-8"> <title>碩編程(yapf.com)</title> </head> <body> <h2>自動(dòng)刷新實(shí)例</h2> <% // 設(shè)置每隔5秒自動(dòng)刷新 response.setintheader("refresh", 5); // 獲取當(dāng)前時(shí)間 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; out.println("當(dāng)前時(shí)間: " + ct + "\n"); %> </body> </html>
將以上代碼保存為main.jsp,然后通過瀏覽器訪問它。它將會(huì)每隔5秒顯示一下系統(tǒng)當(dāng)前時(shí)間。
我們可以看下以下 gif 演示圖:
您也可以自己動(dòng)手修改以上代碼,試試使用其他的方法,將能得到更深的體會(huì)。