JSP伺服器響應


在本章中,我們將討論JSP中的伺服器響應。當Web伺服器響應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」)組成。

以下是從Web伺服器返回瀏覽器的最有用的HTTP 1.1響應頭的摘要。 這些標頭檔案經常用於Web程式設計 -

編號 響應頭 描述
1 Allow 此響應頭指定伺服器支援的請求方法(GETPOST等)。
2 Cache-Control 此響應頭指定響應文件可以安全地快取的情況。它的值可以是publicprivateno-cache等等。public則表示文件是可快取的,private則表示文件是針對單個使用者,只能儲存在私有(非共用)快取中,而no-cache則表示文件不應該被快取。
3 Connection 此響應頭指示瀏覽器是否使用持久HTTP連線。close值指示瀏覽器不使用持久HTTP連線,而keep-alive表示使用持久連線。
4 Content-Disposition 此響應頭允許請求瀏覽器要求使用者將響應儲存到給定名稱的檔案中。
5 Content-Encoding 此響應頭指定在傳輸期間頁面被編碼的方式。
6 Content-Language 此響應頭表示文件寫入的語言。例如,enen-usru
7 Content-Length 此響應頭指示響應中的位元組數。僅當瀏覽器使用持久(保持活動)HTTP連線時,才需要此資訊。
8 Content-Type 此響應頭給出響應文件的MIME(多用途Internet郵件擴充套件)型別。
9 Expires 此響應頭指定內容應被視為過期的時間,因此不再被快取。
10 Last-Modified 此響應頭指示文件何時上次更改。用戶端可以快取文件,並在稍後的請求中通過If-Modified-Since請求頭提供日期。
11 Location 此響應頭應該在300s內包含在狀態程式碼的所有響應中。它通知瀏覽器文件地址。 瀏覽器自動重新連線到此位置並檢索新文件。
12 Refresh 此響應頭指定瀏覽器應該要求更新頁面的時間。可以指定時間,之後它將指定秒數重新整理頁面。
13 Retry-After 此響應頭可以與503(服務不可用)響應一起使用,以便告訴用戶端可以多久重複其請求。
14 Set-Cookie 此響應頭指定與該頁面相關聯的cookie

HttpServletResponse物件

response物件是javax.servlet.http.HttpServletResponse物件的一個範例。就像伺服器建立請求物件一樣,它還建立一個物件來表示對用戶端的響應。

response物件還定義了處理建立新HTTP頭的介面。通過此物件,JSP程式員可以新增新的Cookie或日期戳,HTTP狀態程式碼等。

可以使用以下方法在servlet程式中設定HTTP響應頭。這些方法可用於HttpServletResponse物件。此物件表示伺服器響應。

編號 方法 描述
1 String encodeRedirectURL(String url) 對指定的URL進行編碼,以在sendRedirect()方法中使用,或者如果不需要編碼,則返回URL。
2 String encodeURL(String url) 通過在其中包含對談ID來對指定的URL進行編碼,或者如果不需要編碼,則不會更改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) 新增具有給定名稱和整數值的響應頭。
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-8GB2312
17 void setContentLength(int len) 設定響應中內容正文的長度在HTTP servlet中; 此方法還可以設定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) 設定具有給定名稱和整數值的響應頭。
22 void setLocale(Locale loc) 如果響應尚未提交,則設定響應的區域設定。
23 void setStatus(int sc) 設定此響應的狀態程式碼。

HTTP頭響應範例

開啟Eclipse建立一個動態Web專案:ServerResponse,其專案結構如下所示 -

以下範例將使用setIntHeader()方法設定Refresh頭來模擬數位時鐘,請參考以下程式碼實現。

檔案:index.jsp -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.io.*,java.util.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>伺服器響應範例</title>
</head>
<body>
    <div style="margin: auto; width: 80%;">
        <h2>自動重新整理HTTP檔頭範例</h2>
        <%
            // Set refresh, autoload time as 5 seconds
            response.setIntHeader("Refresh", 3);

            // 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;
            out.println("Current Time is: " + CT + "\n");
        %>
    </div>
</body>
</html>

在上面程式碼編寫完成後,部署這個Web專案,開啟瀏覽器存取URL: http://localhost:8080/ServerResponse/ , 每3秒鐘顯示當前系統時間,如下所示 -