JSP、Cookie和HttpSession

1. jsp的java腳本

  • <%...%>:java代碼片段(常用),用於定義0~N條Java語句!作爲方法內的內容
  • <%=...%>:java表達式,用於輸出(常用),用於輸出一條表達式(或變量)的結果。作爲response.getWriter().print( … )的參數;
  • <%!...%>:聲明,用來創建類的成員變量和成員方法(基本不用)。

2. jsp原理

jsp其實是一種特殊的Servlet:
> 當jsp頁面第一次被訪問時,服務器會把jsp編譯成.java文件(這個java其實是一個servlet類)
> 然後再把.java編譯成.class
> 然後創建該類對象
> 最後調用它的_jspService()方法
> 第二次請求同一jsp時,直接調用_jspService()方法。
在tomcat的work目錄下可以找到jsp對應的.java源代碼。
在這裏插入圖片描述
分析源碼可知
html數據:out.write(“html數據”),即以字符串輸出;
<%...%>:作爲_jspService()方法的一部分內容;
<%=...%>:作爲out.print()的參數,直接輸出變量。
<%!...%>:作爲類的成員變量或成員方法。
<%-- jsp註釋 --%>:當服務器把jsp編譯成java文件時已經忽略了註釋部分!
<!-- html註釋 -->:會保存作爲html文件的註釋

3. Cookie

HTTP協議是無狀態協議,也就是說每個請求都是獨立的!無法記錄前一次請求的狀態。但HTTP協議中可以使用Cookie來完成會話跟蹤!在JavaWeb中,使用session來完成會話跟蹤,session底層依賴Cookie技術。

3.1 Cookie的path:

瀏覽器訪問服務器的路徑,如果包含某個Cookie的路徑,那麼就會歸還這個Cookie。
例如:

aCookie.path=/day11_1/; 
bCookie.path=/day11_1/jsps/;
cCookie.path=/day11_1/jsps/cookie/;
 
訪問:/day11_1/index.jsp時,歸還:aCookie
訪問:/day11_1/jsps/a.jsp時,歸還:aCookie、bCookie
訪問:/day11_1/jsps/cookie/b.jsp時,歸還:aCookie、bCookie、cCookie

Cookie的path默認值:當前訪問路徑的父路徑。例如在訪問/day11_1/jsps/a.jsp時,響應的cookie,那麼這個cookie的默認path爲/day11_1/jsps/。

3.2 JavaWeb中使用Cookie

使用repsonse.addCookie()方法向瀏覽器保存Cookie
使用request.getCookies()方法獲取瀏覽器歸還的Cookie

4.HttpSession

javax.servlet.http.HttpSession接口表示一個會話,我們可以把一個會話內需要共享的數據保存到HttSession對象中!

4.1 原理

session是依賴Cookie實現的。session是服務器端對象。

  • 當用戶第一次使用session時(表示第一次請求服務器),服務器會創建session,並創建一個Cookie,在Cookie中保存了session的id,發送給客戶端。但這個Cookie只在瀏覽器內存中存在。
  • 當用戶第二次訪問服務器時,會在請求中把保存了sessionId的Cookie發送給服務器,服務器通過sessionId查找session對象,然後使用。也就是說,只要瀏覽器容器不關閉,無論訪問服務器多少次,使用的都是同一個session對象。這樣也就可以讓多個請求共享同一個session了。
  • 當用戶關閉了瀏覽器窗口後,再打開瀏覽器訪問服務器,這時服務器會創建一個session,再把sessionId通過Cookie保存到瀏覽器中,也是一個新的會話開始了。原來的session會因爲長時間無法訪問而失效。

4.2 URL重寫

如果用戶的瀏覽器關閉了Cookie功能,那麼session不能使用了!需要如下設置:
使用response.encodeURL()方法對URL進行編碼,這樣URL中會智能的添加sessionId

<a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主頁</a>

<form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">
	<input type="submit" value="提交"/>
</form>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章