2018-5-17 JSP_Web_MVC開發(12)-response內置對象(Cookie)
- 請求重定向--客戶端跳轉
- 設置頭信息
- 操作Cookie
對於伺服器端而言,如果要接收客戶端發送來的請求數據,那麼只能依靠request對象完成。而伺服器端對客戶端的回應就是通過response對象完成。例如之前直接輸出的HTML代碼實際上都屬於伺服器端的回應。
response是javax.servlet.http.HttpServletResponse介面的實例化對象。它繼承自javax.servlet.ServletResponse父介面,而ServletResponse也只有HttpServletResponse一個子介面,這樣的設計與request對象是完全相同的。
在進行回應時候response採用以下方法完成:
- 得到客戶端輸出流:public PrintWriter getWriter() throws IOException
除了輸出之外,在response對象中主要可以實現3個功能:請求重定向,設置頭信息,操作Cookie。
【1.請求重定向】
所謂重定向就是跳轉功能,使用HttpServletResponse介面的如下操作方法:
- 重定向:public void sendRedirect(String location) throws IOException
例 觀察操作--response_send.jsp
<%@ page pageEncoding="UTF-8"%><% response.sendRedirect("param.jsp?username=hello&password=world");%>
此時實現了跳轉操作,但是同時也可以發現地址發生了改變,所以此類跳轉也稱為客戶端跳轉。同時也請記住,如果是客戶端端跳轉,那麼無法傳遞request屬性,只能夠傳遞session、application屬性。
面試題:請解釋JSP之中2種跳轉的區別,或者說請解釋response.sendRedirect()和<jsp:forward>區別。
- response.sendRedirect():屬於客戶端跳轉,跳轉之後地址欄改變,不能傳遞request屬性。此跳轉是在頁面代碼都執行完之後再跳轉。
- <jsp:forward>:屬於伺服器端跳轉,跳轉之後地址欄不改變,可以傳遞request屬性。此跳轉是無條件跳轉,跳轉之後的代碼不再執行。
【2.設置頭信息】
所謂頭信息就是附加在請求數據之外的信息,例如:在之前可以取得客戶端的IP地址,實際上這些IP地址都是附加在頭信息上得到的。如果用戶想知道有哪些頭信息,則可以使用request對象,在HttpServletResponse介面中定義了如下的取得頭信息操作的方法:
- 取得全部頭信息的名字:public Enumeration getHeaderNames();
- 根據名稱取得頭信息的內容:public String getHeader(String name);
例 取得頭信息
<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><% //取得全部頭信息的名稱 Enumeration<String> enu=request.getHeaderNames(); while (enu.hasMoreElements()){ String name=enu.nextElement(); %> <h3><%=name%> = <%=request.getHeader(name)%></h3><% }%>
顯示結果
accept = application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*accept-language = zh-CNua-cpu = AMD64accept-encoding = gzip, deflateuser-agent = Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)host = localhostconnection = Keep-Alivecookie = JSESSIONID=4A75FC7012B49C738C2A817ABBD297
如果要設置頭信息可以使用HttpServletResponse介面的如下方法:
- 設置頭信息:public void setHeader(String name,String value)
最為常用的頭信息就是定時刷新功能,名稱為:refresh。
例 實現一個定時刷新功能
<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2");%>
每2秒刷新一次頁面。一般刷新頻率都是設置為2秒,這樣伺服器才可以承受。
利用刷新可以實現定時跳轉功能。
<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2;URL=welcome.jsp");%>
但是有些時候該操作無法完成,因為瀏覽器不同,有可能是不能進行自動跳轉的。所以為了保險起見,可以增加一個鏈接地址。
<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2;URL=welcome.jsp");%><h2>登錄成功,2秒後自動跳轉到首頁!</h2><h2>如果沒有跳轉,請按<a href="welcome.jsp">這裡</a>!</h2>
面試題:請解釋2種跳轉的區別。
在Web開發之中頁面跳轉有2種形式:
- 客戶端跳轉:跳轉之後地址欄改變,不能傳遞request屬性。此跳轉是在頁面代碼都執行完之後再跳轉。實現方式
- response.sendRedirect(路徑)
- reponse.setHeader("refresh","時間:URL=路徑")
- window.location=路徑
- 超鏈接<a href></a>
- <jsp:forward page="路徑"/>
【3.操作Cookie】
Cookie指的是保存在客戶端上的一組數據,最為常見的功能就是,記住我,下次自動登錄,這就是基於Cookie完成的。由於Cookie是保存個人信息數據,如果電腦是一台公共電腦,那麼會極度不安全。
在JSP中提供有專門Cookie操作類,此類常用方法如下:
- 構造方法:public Cookie(String name,String value)
- 取得Cookie的名字:public String getName()
- 取得Cookie的內容:public String getValue()
如果要想將Cookie數據設置到客戶端上,則可以利用response對象提供的方法完成。
- 將Cookie設置到客戶端:public void addCookie(Cookie cookie)
例 設置Cookie
<%@ page pageEncoding="UTF-8"%><% Cookie c1=new Cookie("username","Hello"); Cookie c2=new Cookie("password","World"); response.addCookie(c1); response.addCookie(c2);%>
在Eclipse中Window->Web Browser選擇IE
然後運行jsp網頁,工具菜單中選擇開發人員工具
在緩存菜單中選擇查看Cookie信息
可以看到Cookie的賦值
通過以上顯示可以發現,所設置的Cookie數據已經成功的保存好了。
此時再運行取得頭信息代碼,得到的結果如下:
accept = */*accept-language = zh-cnuser-agent = Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)ua-cpu = AMD64accept-encoding = gzip, deflatehost = localhostconnection = Keep-Alivecookie = username=Hello; password=World; JSESSIONID=B927FA2D55779F3A92DE48AF27CFC9
所有客戶端的Cookie都是通過頭信息隨著請求一起發生到伺服器端的,所以要想取得設置的Cookie,則必須通過HttpServletRequest介面完成。方法如下:
- 取得全部Cookie:public Cookie[] getCookies(),返回Cookie數組
例 取得全部Cookie
<%@ page pageEncoding="UTF-8"%><% Cookie c[]=request.getCookies();//取得全部Cookies for(int x=0;x<c.length;x++){%> <h2><%=c[x].getName() %>=<%=c[x].getValue() %></h2><% }%>
此時就可以取得全部設置的Cookie數據了
注意:此時設置的Cookie只能保存在當前瀏覽器之中。如果瀏覽器關閉,那麼Cookie會自動消失。如果要想Cookie保存時間長一些,那麼可以加入保存時間。
- Cookie類提供的方法:public void setMaxAge(int expiry),單位秒
例 修改Cookie保存時間
<%@ page pageEncoding="UTF-8"%><% Cookie c1=new Cookie("username","Hello"); Cookie c2=new Cookie("password","World"); c1.setMaxAge(30); c2.setMaxAge(90); response.addCookie(c1); response.addCookie(c2);%>
在實際工作中,如果真的實現了Cookie保存用戶名和密碼功能,那麼數據一定要加密處理。
總結
response對象中,最重要的就是2個跳轉的概念。
推薦閱讀:
※MVC系列——一個異常消息傳遞引發的思考
※django系列九:頁面布局
※MVC 模式的原理,它在 Android 中是如何運用的?
※「每日一題」MVC 是什麼?(續1)
※django系列五:資料庫配置