官术网_书友最值得收藏!

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刷新之后的效果

主站蜘蛛池模板: 天峨县| 甘南县| 买车| 筠连县| 阳朔县| 荥经县| 鄢陵县| 永泰县| 永泰县| 大庆市| 新平| 类乌齐县| 油尖旺区| 赣州市| 伊金霍洛旗| 留坝县| 辰溪县| 温泉县| 老河口市| 青浦区| 邻水| 奎屯市| 双鸭山市| 吉木萨尔县| 普宁市| 南投县| 盖州市| 利川市| 名山县| 琼海市| 敦煌市| 乌审旗| 黄龙县| 高州市| 揭东县| 仙游县| 达拉特旗| 霍林郭勒市| 葫芦岛市| 普兰店市| 扎鲁特旗|