JSP 服務(wù)器響應(yīng)
jsp 服務(wù)器響應(yīng)
response響應(yīng)對象主要將jsp容器處理后的結(jié)果傳回到客戶端??梢酝ㄟ^response變量設(shè)置http的狀態(tài)和向客戶端發(fā)送數(shù)據(jù),如cookie、http文件頭信息等。
一個典型的響應(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,一個狀態(tài)碼,比如200,還有一個非常短的信息對應(yīng)著狀態(tài)碼,比如ok。
下表摘要出了http1.1響應(yīng)頭中最有用的部分,在網(wǎng)絡(luò)編程中您將會經(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)以給定的名稱存儲在磁盤中 |
content-encoding | 指定傳輸時頁面的編碼規(guī)則 |
content-language | 表述文檔所使用的語言,比如en, en-us,,ru等等 |
content-length | 表明響應(yīng)的字節(jié)數(shù)。只有在瀏覽器使用持久化 (keep-alive) http 連接時才有用 |
content-type | 表明文檔使用的mime類型 |
expires | 指明啥時候過期并從緩存中移除 |
last-modified | 指明文檔最后修改時間??蛻舳丝梢?緩存文檔并且在后續(xù)的請求中提供一個 if-modified-since請求頭 |
location | 在300秒內(nèi),包含所有的有一個狀態(tài)碼的響應(yīng)地址,瀏覽器會自動重連然后檢索新文檔 |
refresh | 指明瀏覽器每隔多久請求更新一次頁面。 |
retry-after | 與503 (service unavailable)一起使用來告訴用戶多久后請求將會得到響應(yīng) |
set-cookie | 指明當前頁面對應(yīng)的cookie |
httpservletresponse類
response 對象是 javax.servlet.http.httpservletresponse 類的一個實例。就像服務(wù)器會創(chuàng)建request對象一樣,它也會創(chuàng)建一個客戶端響應(yīng)。
response對象定義了處理創(chuàng)建http信息頭的接口。通過使用這個對象,開發(fā)者們可以添加新的cookie或時間戳,還有http狀態(tài)碼等等。
下表列出了用來設(shè)置http響應(yīng)頭的方法,這些方法由httpservletresponse 類提供:
s.n. | 方法 & 描述 |
---|---|
1 | string encoderedirecturl(string url) 對sendredirect()方法使用的url進行編碼 |
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ā)送一個出錯響應(yīng),然后清除緩存 |
13 | void senderror(int sc, string msg) 使用指定的狀態(tài)碼和消息向客戶端發(fā)送一個出錯響應(yīng) |
14 | void sendredirect(string location) 使用指定的url向客戶端發(fā)送一個臨時的間接響應(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 標頭 |
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()方法來模擬一個數(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>自動刷新實例</h2> <% // 設(shè)置每隔5秒自動刷新 response.setintheader("refresh", 5); // 獲取當前時間 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("當前時間: " + ct + "\n"); %> </body> </html>
將以上代碼保存為main.jsp,然后通過瀏覽器訪問它。它將會每隔5秒顯示一下系統(tǒng)當前時間。
我們可以看下以下 gif 演示圖:
您也可以自己動手修改以上代碼,試試使用其他的方法,將能得到更深的體會。