- 從零開始學Java Web開發
- 孫更新等編著
- 2002字
- 2018-12-27 13:06:07
5.3 response內置對象
與request對象相對應,response對象用于對客戶端提交的請求做出動態響應,將JSP服務器處理后的信息傳回到客戶端。response對象的主要方法如表5.3所示。
表5.3 response對象中常用方法

response對象的用法不像request對象那樣比較集中,其應用的方向相對分散,沒有過多的共同點,顯得比較雜亂。因此下面通過對response對象的幾個典型應用的分析使讀者對該對象有更清楚的認識。
5.3.1 response實現頁面轉向
使用response對象的sendRedirect(String location)方法可以實現頁面的轉向。在第4章中介紹過的<jsp:forward>動作指令也能夠實現頁面的轉向,那么這兩種轉向有什么不同呢?它們的區別主要體現在兩個方面。
? <jsp:forward>動作指令是JSP引擎中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址。sendRedirect(String location)方法則是完全的跳轉,瀏覽器將會得到跳轉后的地址,并重新發送請求鏈接。這樣,從瀏覽器的地址欄中就可以看到跳轉后的鏈接地址。
? <jsp:forward>動作指令中的page屬性用來指定轉向的地址,但該地址必須是一個相對路徑,簡單地說也就是,轉向頁面和轉向到的頁面必須位于一個Web應用中。而sendRedirect()方法中的location屬性也是用來指定轉向的地址,但該地址既可以是相對路徑也可以是一個合法的URL,也就是說使用sendRedirect()方法可以轉向到Internet中存在的任何網頁中。
【實例5-5】使用response實現頁面轉向。
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include編譯指令測試<br> 05 <% 06 response.sendRedirect("include.jsp"); //將頁面轉向到同一個應用程序中的 include.jsp頁面 07 %> 08 </body> 09 </html>
【代碼說明】該頁面的第6行使用sendRedirect()方法將轉向到include.jsp頁面。
include.jsp頁面的具體代碼如下:
01 <%@ page contentType="text/html;charset=ISO-8859-1"%> 02 <%! String str="Here is include's context!"; //聲明要顯示的字符串對象%> 03 <% out.println(str+"<br>"); //將字符串顯示到頁面上%>

圖5.8 使用sendRedirect()方法轉向到的頁面
【代碼說明】該頁面的第2行聲明一個字符串對象,并在第3行使用out對象將字符串顯示在頁面上。
【運行結果】實例5-5 的JSP頁面的執行結果如圖5.8所示。
與第4章中的實例4-5的執行結果相比較可以看出,實例4-5運行結果中瀏覽器的地址欄中顯示的是轉向之前的頁面路徑,而本實例的運行結果中瀏覽器的地址欄中顯示的則是轉向之后的頁面路徑。
如果將實例5-5的代碼修改如下:
01 <%@ page contentType="text/html;charset=GB2312"%> 02 <html> 03 <body> 04 include編譯指令測試<br> 05 <% 06 response.sendRedirect("http://www.sina.com"); //將頁面轉向到應用程序之外的頁面 07 %> 08 </body> 09 </html>

圖5.9 顯示轉向到的站外頁面
該頁面的第6行將使用sendRedirect()方法轉向到如圖5.9所示的新浪網站的首頁面,這表明使用sendRedirect()方法可以轉向到Internet中存在的任何網頁中。
5.3.2 動態設置頁面返回的MIME類型
在JSP中可以使用page編譯指令來設置返回頁面的MIME返回類型,但是在這里設置是在頁面的編譯階段,也就是說一旦設置完成后,在頁面的運行階段是不能進行修改了。而使用response對象中的setContentType(String type)方法來動態設置頁面的返回類型。
【實例5-6】動態設置頁面的返回類型。在該實例中將在頁面中包含一個文本文件,然后在運行時由用戶選擇頁面的返回類型。
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY><Font size=5 > 04 <P>使用什么方式顯示成績? 05 <FORM action="show.jsp" method="post" name=form> 06 <INPUT TYPE="submit" value="word" name="submit1"> 07 <INPUT TYPE="submit" value="excel" name="submit2"> 08 </FORM> 09 </FONT> 10 </BODY> 11 </HTML>
【代碼說明】在該頁面的第6~7 行的<form>表單中聲明了兩個提交按鈕,單擊任何一個提交按鈕都將請求show.jsp頁面。
然后創建一個文本文件A.txt,在其中輸入如下內容:
姓名 數學 英語 語文<br> 李明 85 77 92<br> 王超 95 88 75<br> 張麗 88 92 77<br> 楊梅 96 85 88<br>
在show.jsp頁面中包含該文本文件,該頁面將根據獲取的提交按鈕的value值來判斷用戶到底是單擊了哪一個提交按鈕。并根據用戶單擊的提交按鈕來動態設置返回頁面的類型,show.jsp頁面的具體代碼定義如下:
01 <%@ page contentType="text/html;charset=GB2312" %> 02 <HTML> 03 <BODY> 04 <% String str1=request.getParameter("submit1"); //獲取submit1按鈕的值 05 String str2=request.getParameter("submit2"); //獲取submit2按鈕的值 06 if(str1==null)//如果str1為null,則表示submit1按鈕沒有被單擊,這時將str1設置為 空字符串 07 {str1=""; 08 } 09 if(str2==null) //如果str2為null,則表示submit2按鈕沒有被單擊,這時將str2設置 為空字符串 10 {str2=""; 11 } 12 if(str1.startsWith("word")) //如果str1 字符串以“word”開頭,則頁面以word 文檔形式返回 13 {response.setContentType("application/msword;charset=GB2312"); 14 15 } 16 if(str2.startsWith("excel")) //如果str2字符串以“excel”開頭,則頁面以excel 文檔形式返回 17 {response.setContentType("application/x-msexcel;charset=GB2312"); 18 } 19 %> 20 <jsp:include page="A.txt"/> 21 </BODY> 22 </HTML>
【代碼說明】該頁面的第4~5行用來獲取提交按鈕的參數,第12~18行將根據提交按鈕的參數來動態設置頁面返回類型,第13行設置頁面返回類型為Word形式,第17行設置頁面返回類型為Excel形式。
說明
setContentType()方法中的MIME類型可以設置為application/x-msexcel、text/html、application/msword等。
【運行結果】實例5-6的JSP頁面的執行結果如圖5.10所示。當單擊“word”提交按鈕時,將以Word文檔的形式返回如圖5.11所示的頁面。當單擊“excel”提交按鈕時,將以Excel文檔的形式返回如圖5.12所示的頁面。

圖5.10 用戶選擇顯示方式的頁面

圖5.11 以Word文檔的形式返回頁面

圖5.12 以Excel文檔的形式返回頁面
5.3.3 設置HTTP協議的傳送文件頭信息
request對象可以使用getHeaders(String name)方法來獲取HTTP協議中的頭信息,與之對應,使用response對象的setHeader(String name,String value)方法可以在返回頁面的同時設置HTTP協議中的頭信息,從而對返回給客戶端的頁面進行特殊設置。
例如,有時候當訪問某個頁面時,返回的頁面卻是之前的數據,執行瀏覽器上的刷新操作,才能看到更改數據后的結果。這個問題有時是因為瀏覽器會將之前瀏覽過的數據存放在瀏覽器的緩存中,所以當再次訪問時,瀏覽器會直接從本地緩存中取出,因此會顯示之前舊的數據。為了解決這一問題,可以在JSP頁面的開頭添加如下代碼:
<% if (request.getProtocol().compareTo("HTTP/1.0")==0) //判斷客戶端是否使用的是HTTP 1.0版本 response.setHeader("Pragma", "no-cache"); //HTTP 1.0協議中設置禁用緩沖 區的格式 else if (request.getProtocol().compareTo("HTTP/1.1")==0) //判斷客戶端是否使用的是 HTTP 1.1版本 response.setHeader("Cache-Control", "no-cache"); //HTTP 1.1協議中設置禁用緩沖 區的格式 response.setDateHeader("Expires", 0); //設置緩存的過期時間為0秒 %>
上述代碼中首先調用request對象的getProtocol()方法來獲取當前使用的協議,如果為HTTP/1.0,就設定HTTP頭信息內容為setHeader("Pragma", "no-cache");若為HTTP/1.1就設定HTTP頭信息為setHeader("Cache-Control", "no-cache"),這是根據不同的HTTP協議版本來取消緩存。最后再調用response對象的setDateHeader("Expires", 0)方法來設置緩存的過期時間為0秒。這樣瀏覽網頁時,就不會將訪問過的頁面再存放到瀏覽器或是代理服務器的緩存中了。
下面再舉一個設置HTTP協議頭信息的常用案例。在制作動態網頁時常常需要對一個網頁進行定時刷新,以便更新要顯示的內容,這就需要用到response對象的setHeader()方法。例如,需要讓瀏覽器每隔1分鐘就重新刷新此網頁,則可以使用如下代碼:
response.setHeader("Refresh" , "60")
如果想要過10秒后,調用瀏覽器轉到http://www.sina.com的首頁面時,則可以使用如下代碼:
response.setHeader("Refresh","10; URL=http://www.sina.com" )
說明
在很多應用開發中經常在用戶注冊后自動跳轉到用戶之前訪問的頁面,所以該功能是日常開發中經常用到的功能。
- 基于C語言的程序設計
- 機器學習及應用(在線實驗+在線自測)
- Circos Data Visualization How-to
- 自動檢測與傳感技術
- STM32G4入門與電機控制實戰:基于X-CUBE-MCSDK的無刷直流電機與永磁同步電機控制實現
- Apache Spark Deep Learning Cookbook
- 網絡組建與互聯
- Linux:Powerful Server Administration
- 基于企業網站的顧客感知服務質量評價理論模型與實證研究
- Building a BeagleBone Black Super Cluster
- 網絡服務搭建、配置與管理大全(Linux版)
- Serverless Design Patterns and Best Practices
- 實戰Windows Azure
- 微機組裝與維護教程
- Photoshop CS6白金手冊