# JSP 服務器響應
Response響應對象主要將JSP容器處理后的結果傳回到客戶端。可以通過response變量設置HTTP的狀態和向客戶端發送數據,如Cookie、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。
下表摘要出了HTTP1.1響應頭中最有用的部分,在網絡編程中您將會經常見到它們:
| **響應頭** | **描述** |
| --- | --- |
| Allow | 指定服務器支持的request方法(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類型 |
| Expires | 指明啥時候過期并從緩存中移除 |
| Last-Modified | 指明文檔最后修改時間。客戶端可以 緩存文檔并且在后續的請求中提供一個?**If-Modified-Since**請求頭 |
| Location | 在300秒內,包含所有的有一個狀態碼的響應地址,瀏覽器會自動重連然后檢索新文檔 |
| Refresh | 指明瀏覽器每隔多久請求更新一次頁面。 |
| Retry-After | 與503 (Service Unavailable)一起使用來告訴用戶多久后請求將會得到響應 |
| Set-Cookie | 指明當前頁面對應的cookie |
## HttpServletResponse類
response對象是javax.servlet.http.HttpServletRequest類的一個實例。就像服務器會創建request對象一樣,它也會創建一個客戶端響應。
response對象定義了處理創建HTTP信息頭的接口。通過使用這個對象,開發者們可以添加新的cookie或時間戳,還有HTTP狀態嗎等等。
下表列出了用來設置HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:
| **方法** | **描述** |
| --- | --- |
| **String encodeRedirectURL(String url)** |對sendRedirect()方法使用的URL進行編碼 |
| **String encodeURL(String url)** |將URL編碼,回傳包含Session ID的URL |
| **boolean containsHeader(String name)** |返回指定的響應頭是否存在 |
| **boolean isCommitted()** |返回響應是否已經提交到客戶端 |
| **void addCookie(Cookie cookie)** |添加指定的cookie至響應中 |
| **void addDateHeader(String name, long date)** |添加指定名稱的響應頭和日期值 |
| **void addHeader(String name, String value)** |添加指定名稱的響應頭和值 |
| **void addIntHeader(String name, int value)** |添加指定名稱的響應頭和int值 |
| **void flushBuffer()** |將任何緩存中的內容寫入客戶端 |
| **void reset()** |清除任何緩存中的任何數據,包括狀態碼和各種響應頭 |
| **void resetBuffer()** |清除基本的緩存數據,不包括響應頭和狀態碼 |
| **void sendError(int sc)** |使用指定的狀態碼向客戶端發送一個出錯響應,然后清除緩存 |
| **void sendError(int sc, String msg)** |使用指定的狀態碼和消息向客戶端發送一個出錯響應 |
| **void sendRedirect(String location)** |使用指定的URL向客戶端發送一個臨時的間接響應 |
| **void setBufferSize(int size)** |設置響應體的緩存區大小 |
| **void setCharacterEncoding(String charset)** |指定響應的編碼集(MIME字符集),例如UTF-8 |
| **void setContentLength(int len)** |指定HTTP servlets中響應的內容的長度,此方法用來設置 HTTP Content-Length 信息頭 |
| **void setContentType(String type)** |設置響應的內容的類型,如果響應還未被提交的話 |
| **void setDateHeader(String name, long date)** |使用指定名稱和值設置響應頭的名稱和內容 |
| **void setHeader(String name, String value)** |使用指定名稱和值設置響應頭的名稱和內容 |
| **void setIntHeader(String name, int value)** |使用指定名稱和值設置響應頭的名稱和內容 |
| **void setLocale(Locale loc)** |設置響應的語言環境,如果響應尚未被提交的話 |
| **void setStatus(int sc)** |設置響應的狀態碼 |
## HTTP響應頭程序示例
接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鐘:
```
<%@ page import="java.io.*,java.util.*" %>
<html>
<head>
<title>Auto Refresh Header Example</title>
</head>
<body>
<center>
<h2>Auto Refresh Header Example</h2>
<%
// 設置每隔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("Current Time is: " + CT + "\n");
%>
</center>
</body>
</html>
```
將以上代碼保存為main.jsp,然后通過瀏覽器訪問它。它將會每隔5秒顯示一下系統當前時間。
運行結果如下:
```
Auto Refresh Header Example
Current Time is: 9:44:50 PM
```
您也可以自己動手修改以上代碼,試試使用其他的方法,將能得到更深的體會。
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明