- JSP應用與開發(fā)技術(第3版)
- 馬建紅 李學相 韓穎 王瑞娟 張晗
- 2013字
- 2020-06-30 17:13:24
4.3 response對象
response對象用于將服務器端數(shù)據(jù)發(fā)送到客戶端以響應客戶端的請求。response對象實現(xiàn)HttpServletResponse接口,可對客戶的請求做出動態(tài)的響應,向客戶端發(fā)送數(shù)據(jù),如Cookie、HTTP文件頭信息等,一般是HttpServlet.Response類或其子類的一個對象。
4.3.1 response對象常用方法
response對象的主要方法及說明如表4-3所示。
表4-3 response對象的主要方法及說明

4.3.2 response對象應用實例
1. public void setContentType(String type)動態(tài)響應contenType屬性
當一個用戶訪問一個JSP頁面時,如果該頁面用page指令設置頁面的contentType屬性是text/html,那么JSP引擎將按照這種屬性值作出反映。如果要動態(tài)改變這個屬性值來響應客戶,需要使用response對象的setContentType(string s)方法來改變contentType的屬性值。
設置輸出數(shù)據(jù)的類型如下。
text/html:網(wǎng)頁。
text/plain:純文本。
application/x-mse xcel:Excel文件。
application/msword:Word文件。
【例4-5】創(chuàng)建setContentType.jsp頁面,應用setContentType改變contentType的屬性值。
setContentType.jsp的代碼如下:

在瀏覽器中輸入http://localhost:8080/ch04/ response/setContentType.jsp,運行結果如圖4-8所示。

圖4-8 setContentType.jsp運行結果
分別單擊word、excel按鈕,則會采用不同的方式打開或保存setContentType.jsp文件,如圖4-9所示。

圖4-9 用Word方式或Excel方式打開setContentType.jsp文件
如果想以其他類型顯示文件,只需修改response.setContentType(String contentType);中的contentType參數(shù)的相應類型即可。
2. 設置刷新public void setHeader(Stringname, String value)
setHeader可以設置HTTP應答報文的首部字段和值;利用setHeader()方法可以設置頁面的自動刷新。例如:
reponse.setHeader("Refresh","5"); //5秒種后自動刷新本頁面 reponse.setHeader("Refresh", "5;URL=http://www.163.com");//5秒種后自動跳轉(zhuǎn)到新頁面
【例4-6】在refresh.jsp頁面中控制頁面的刷新頻率,動態(tài)設置網(wǎng)頁刷新。
refresh.jsp的代碼如下:

運行結果如圖4-10所示,可以看到頁面每一秒鐘刷新一次,顯示新的時間和隨機數(shù)。

圖4-10 refresh.jsp運行結果
3. void sendRedirect(String redirectURL)將客戶端重定向到指定的URL
在某些情況下,當響應客戶時,需要將客戶重新引導至另一個頁面,可以使用response的sendRedirect(URL)方法實現(xiàn)客戶的重定向。
sendRedirect和<jsp:forward>的區(qū)別如下:
response.sendredirect()會在客戶端呈現(xiàn)跳轉(zhuǎn)后的URL地址,這種跳轉(zhuǎn)稱為客戶端跳轉(zhuǎn)。使用response.sendredirect()方法將重定向的URL發(fā)送到客戶端,瀏覽器再根據(jù)這個URL重新發(fā)起請求。所以用這個方法時,在瀏覽器地址欄上會看到新的請求資源的地址。并且這時的request和response都與第一次的不一樣了,因為產(chǎn)生了新的request和response。
使用<jsp:forward>完全是在服務器上進行,瀏覽器地址欄中的地址保持不變,這種跳轉(zhuǎn)稱為服務器端跳轉(zhuǎn)。所以使用這個方法時沒有產(chǎn)生新的request和response,因為request沒有變,在同一個請求內(nèi),可以用request來傳遞參數(shù)。
response.sendRedirect()方法想帶參數(shù)的話,在地址中寫成xxx.jsp?param1=aaa&...這種形式傳遞參數(shù)。<jsp:forward>能夠使用<jsp:param/>標簽向目標文件傳送參數(shù)和值,目標文件必須是一個動態(tài)的文件,能夠處理參數(shù)。
<jsp:forward>后面的語句不會被執(zhí)行,也不會繼續(xù)發(fā)送到客戶端;response.sendRedirect()方法后面的語句會繼續(xù)執(zhí)行,除非語句前面有return。
<jsp:forward>是在服務器的內(nèi)部進行轉(zhuǎn)換,只發(fā)送給客戶端最后轉(zhuǎn)到的頁面,速度會比較快;response.sendRedirect()方法需要服務器與客戶端之間的往返,可以轉(zhuǎn)到任何頁面,包括網(wǎng)絡有效域名,但速度比較慢。
【例4-7】頁面重定向?qū)嵗T趕endRedirect.jsp中輸入用戶名,然后重定向到redirect.jsp頁面,顯示輸入的用戶名。
sendRedirect.jsp的代碼如下:

redirect.jsp的代碼如下:

在瀏覽器中輸入http://localhost:8080/ch04/response/sendRedirect.jsp,在表單中輸入數(shù)據(jù)后單擊login按鈕,會發(fā)現(xiàn)地址欄中的地址變?yōu)閔ttp://localhost:8080/ch04/response/redirect.jsp?sendname =xxx,說明已經(jīng)跳轉(zhuǎn)到其他的URL。
如果把上例中的頁面重定向語句response.sendRedirect("redirect.jsp?sendname=" + name);改為<jsp:forward page="redirect.jsp"/>不用傳遞參數(shù)name,在redirect.jsp中采用String sendname =request.getParameter("name");即可得到輸入的用戶名。注意,在這里參數(shù)名為name,和表單項的名字一致,說明request沒有改變,在同一個請求內(nèi)。但是如果采用response.sendRedirect()重定向必須傳遞參數(shù),否則得到null值,因為產(chǎn)生了新的request對象。
另外,response.sendRedirect()方法后面的語句會繼續(xù)執(zhí)行,可以看到控制臺上輸出的文字,程序執(zhí)行結果如圖4-11所示。當然如果改為<jsp:forward page="redirect.jsp"/>,則控制臺上不會顯示,如圖4-11所示文字。

圖4-11 頁面重定向運行結果
4. 設定狀態(tài)顯示碼的方法void setStatus(int n)
當服務器對請求進行響應時,發(fā)送的首行被稱為狀態(tài)行。
response的狀態(tài)行包括3位數(shù)字的狀態(tài)代碼,下面是對5類狀態(tài)代碼的簡單描述。
1**(1開頭的3位數(shù)字):主要是實驗性質(zhì)的。
2**:用來表示請求成功。
3**:用來表示在請求滿足之前應該采取進一步的行動。
4**:當瀏覽器做出無法滿足的請求時,返回該狀態(tài)碼。
5**:用來表示服務器出現(xiàn)的問題。
一般情況下頁面中不需要修改狀態(tài)行,在服務器處理頁面時一旦出現(xiàn)問題,服務器會自動響應,并發(fā)送響應的狀態(tài)行代碼。因此了解狀態(tài)代碼能夠便于程序調(diào)試。通過狀態(tài)代碼提示能夠快速查找出程序出現(xiàn)的問題。
狀態(tài)碼及其說明如表4-4所示。
表4-4 狀態(tài)代碼表

【例4-8】設置響應的狀態(tài)行示例。在setStatus.jsp中將幾個超級鏈接鏈接到不同的頁面,根據(jù)設置的狀態(tài)碼顯示不同的頁面狀態(tài)。
setStatus.jsp的代碼如下:
<%@ page contentType="text/html; charset=GB2312"%> <html> <body bgcolor=cyan> <font size=3> <p>單擊下面的超級鏈接:<br> <a href="status1.jsp">狀態(tài)行請求超時<br> <a href="status2.jsp">狀態(tài)行請求成功<br> <a href="status3.jsp">狀態(tài)表示服務器內(nèi)部錯誤 </font> </body> </html>
status1.jsp的代碼如下:

status2.jsp的代碼如下:

status3.jsp的代碼如下:
<%@ page contentType="text/html; charset=GB2312"%> <html> <body> <% response.setStatus(500); %> </body> </html>
程序執(zhí)行結果如圖4-12所示。

圖4-12 程序執(zhí)行過程
5. void addCookie(Cookie cookie)
添加一個Cookie對象,用來保存客戶端的用戶信息。可以通過request對象的getCookie()方法獲得這個Cookie。Cookie可以保存用戶的個性化信息,從而對下一次訪問提供方便。
【例4-9】創(chuàng)建responseCookie.jsp頁面,通過response對象對Cookie進行操作。
responseCookie.jsp的代碼如下:

responseCookie.jsp在第一次執(zhí)行時由于沒有創(chuàng)建Cookie對象,所以顯示如圖4-13所示。

圖4-13 responseCookie.jsp第一次執(zhí)行時的效果
當刷新頁面后,會顯示所創(chuàng)建的Cookie對象的名cookietest和它的值,即上次訪問的時間,每次刷新都會把當前時間和上次訪問時間顯示出來,如圖4-14所示。關于Cookie的內(nèi)容請參考第5章的詳細介紹。

圖4-14 responseCookie.jsp刷新之后的效果