From Gossip@caterpillar

JSP/Servlet: response

 

 


JSP的response隱含物件在轉換為Servlet之後,對應於javax.servlet.http.HttpServletResponse型 態物件, HttpServletResponse物件是有關於對客戶端請求之回應,您可以利用它來設定一些要回應的訊息,例如標題訊息、回應狀態碼等,必要的話, 您也可以由HttpServletResponse取得PrintWriter物件,由它來回應客戶端,以獲得PrintWriter的好處,而不是使用 JSP預設的out(JSPWriter)來應答客戶端。

首先介紹幾個 response(HttpServletResponse)設定標頭(Header)的方法,要使用這些標頭,您必須對HTTP協議先有些瞭解,這請自行查閱相關書籍,這邊假設您已經瞭解標頭的意義。

下面是如何設定"Refresh"標頭,在指定的時間後刷新網頁,或載入指定的網頁:

  • headerDemo.jsp
<%! int reloadCount = 0; %> 
<%
response.setHeader("Refresh", "3");
out.println("realod: " + reloadCount);
reloadCount++;
%>

setHeader()方法是一個通用的標頭設定方法,您可以用它來設定任何「名稱/值」的標頭,上面這個例子會每三秒鐘自動載入網頁,您可以由網頁上不 斷遞增的數字看到重新載入的次數,如果標頭設定的是一個整數值,則您也可以直接使用setIntHeader(),它是專門用來設定整數值標頭的版本,例 如:
response.setIntHeader("Refresh", 3);

使用setHeader()的好處是,您可以像以下這麼設定標頭:
response.setHeader("Refresh",
      "3; URL=http://caterpillar.onlyfun.net/");
 

上面的設定會在載入網頁,在3秒之後重新載入指定的網頁;注意標頭的設定必須在送出任何網頁本體(Body)之前設定好,如果網頁本體(例如HTML內容)已經送出,則設定標頭的動作是無用的。

如果您想要瀏覽器不要快取網頁,由於HTTP/1.0與HTTP1.1的設定方式不同,您可以使用先判定協定種類以設定不同的標頭,例如:

  • headerDemo.jsp
<% 
    // HTTP/1.0的話
    if(request.getProtocol().equals("HTTP/1.0")) {
        response.setHeader("Pragma", "no-cache");
    }
    else if(request.getProtocol().equals("HTTP/1.1")) {
        response.setHeader("Cache-Control", "no-cache");
    }
 
    response.setDateHeader("Expires", 0);
%>

setDateHeader()是setHeader()的Date設定版本,第二個參數是設定Date的Long數值,0表示GMT 1970/1/1 00:00

setHeader()、setIntHeader()與setDateHeader()方法會直接覆蓋標頭設定,如果您要對同一個標頭進行多值設定,可以使用add開頭的方法,例如:

  • headerDemo.jsp
<%@page contentType="text/html;charset=Big5"%> 
<%
response.setHeader("Refresh", "3");
response.addHeader("Refresh",
"URL=http://caterpillar.onlyfun.net/");
out.println("三秒後重新載入指定網頁");
%>

這個例子中先設定標頭Refresh為3,然後加入URL資訊,新的資訊並不會覆蓋之前的標頭設定,其作用相當於:
response.setHeader("Refresh",
     "3; URL=http://caterpillar.onlyfun.net/");
 

同樣的,以add為開頭來設定標頭的方法也有Int與Date版本。

response(HttpServletResponse)的setStatus()方法是用來設定回應的狀態碼,例如404 Not Found,HttpServletResponse類中提供了一些助憶常數設定,例如SC_NOT_FOUND就是表示404狀態碼(您可以在 Servlet API文件中查詢相關的助憶常數),使用setStatus()必須自行處理回應方式,如果是錯誤相關網頁,您可以使用sendError()方法,這個方法會根據伺服器的預設錯誤網頁回報方式顯示錯誤訊息,例如:

  • errorDemo.jsp
<%@page contentType="text/html;charset=Big5"%> 
<%
response.sendError(response.SC_NOT_FOUND, "找不到檔案");
%>

對Tomcat來說,會顯示以下的訊息:
HTTP Status 404 - 找不到檔案

type Status report

message 找不到檔案

description The requested resource (找不到檔案) is not available.
.....

使用setStatus()必須自行處理回應方式,下面是一個例子,它可以讓瀏覽器直接導向至指定的網頁:

  • statusDemo.jsp
<% 
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location",
"http://caterpillar.onlyfun.net/");
%>

事實上,上面的程式只要使用sendRedirect()方法就可以了,例如:
  • redirectDemo.jsp
<% 
response.sendRedirect("http://caterpillar.onlyfun.net/");
%>

response是HttpServletResponse型態的物件,在Servlet的實作中,是從 HttpServletResponse物件取得PrintWriter物件,由它來寫出回應至伺服器的本體資訊,在JSP中也可以取得 PrintWriter物件,例如您可以用PrintWriter來顯示例外的堆疊追蹤:
  • exceptionDemo.jsp
<%@page contentType="text/html;charset=Big5" 
isErrorPage="true"%>
<html>
<head><title>錯誤處理頁面</title></head>
<body>
<H1>網頁發生錯誤:</H1><%=exception%>
<H2>顯示例外堆疊追蹤:</H2>
<%
exception.printStackTrace(response.getWriter());
%>
</body>
</html>