JSP 伺服器響應

JSP 伺服器響應

Response響應物件主要將JSP容器處理後的結果傳回到客戶端。可以通過response變數設定HTTP的狀態和向客戶端傳送資料,如Cookie、HTTP檔案頭資訊等。

一個典型的響應看起來就像下面這樣:

HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (空行)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>

狀態行包含HTTP版本資訊,比如HTTP/1.1,一個狀態碼,比如200,還有一個非常短的資訊對應著狀態碼,比如OK。

下表摘要出了HTTP1.1響應頭中最有用的部分,在網路程式設計中您將會經常見到它們:

響應頭 描述
Allow 指定伺服器支援的request方法(GET,POST等等)
Cache-Control 指定響應文件能夠被安全快取的情況。通常取值為 publicprivate 或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.HttpServletResponse 類的一個例項。就像伺服器會建立request物件一樣,它也會建立一個客戶端響應。

response物件定義了處理建立HTTP資訊頭的介面。通過使用這個物件,開發者們可以新增新的cookie或時間戳,還有HTTP狀態碼等等。

下表列出了用來設定HTTP響應頭的方法,這些方法由HttpServletResponse 類提供:

S.N. 方法 & 描述
1 String encodeRedirectURL(String url)

對sendRedirect()方法使用的URL進行編碼
2 String encodeURL(String url)

將URL編碼,回傳包含Session ID的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)

新增指定名稱的響應頭和int值
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 servlets中響應的內容的長度,此方法用來設定 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)

指定 int 型別的值到 name 標頭
22 void setLocale(Locale loc)

設定響應的語言環境,如果響應尚未被提交的話
23 void setStatus(int sc)

設定響應的狀態碼

HTTP響應頭程式示例

接下來的例子使用setIntHeader()方法和setRefreshHeader()方法來模擬一個數字時鐘:

<%@ 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>入門教學(itread01.com)</title>
</head>
<body>
<h2>自動重新整理例項</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("當前時間: " + CT + "\n");
%>
</body>
</html>

將以上程式碼儲存為main.jsp,然後通過瀏覽器訪問它。它將會每隔5秒顯示一下系統當前時間。

我們可以看下以下 Gif 演示圖:

您也可以自己動手修改以上程式碼,試試使用其他的方法,將能得到更深的體會。