session,application,pageContext的作用域區別
在JSP中,常用三個作用域通信物件,分辨是session,application,pagecontext,
那首先讓我們了解一下這三個物件作用域范圍,
pageContext:只作用于一個頁面,作用域最小,頁面關閉,則物件存盤資料消失,
session:session物件存盤的資料作用于在同一個會話中的所有頁面,直到瀏覽器關閉,不同的會話是不同的session物件,用于存盤各個客戶端各自的資料,
application:application是作用于整個服務器,一個服務器只有一個application物件,只要服務器不關閉,將一直存在,所有客戶端都共享該物件資料,范圍最大,時間最久,只要不是很關鍵的公用資料,都不會存盤在該物件中,
接下來讓我們用一個訪問頁面的例子來了解各自的區別:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//宣告變數來輸入在各作用域物件中的值
int pageCount = 0;
int sessionCount = 0;
int appCount = 0;
if(pageContext.getAttribute("pageCount") == null){//當物件中的pageCount屬性還沒被創建時,進入條件以創建
pageCount = 1;
pageContext.setAttribute("pageCount","1");//將資料存入pageContext物件
}else{
//每存入一次資料,將次數加1,因為getAttribute回傳的是Object物件,所以需要轉成字串再轉成數字
pageCount = Integer.parseInt(pageContext.getAttribute("pageCount").toString()) +1;
}//將訪問次數資料存入物件
pageContext.setAttribute("pageCount", pageCount);
//和前面原理一樣,
if(session.getAttribute("sessionCount") == null){
sessionCount = 1;
pageContext.setAttribute("sessionCount","1");
}else{
sessionCount = Integer.parseInt(session.getAttribute("sessionCount").toString()) +1;
} session.setAttribute("sessionCount", sessionCount);
if(application.getAttribute("appCount") == null){
appCount = 1;
application.setAttribute("appCount","1");
}else{
appCount = Integer.parseInt(application.getAttribute("appCount").toString()) +1;
} application.setAttribute("appCount", appCount);
%>
<h1>頁面次數:<%=pageCount %></h1>
<h2>會話次數:<%=sessionCount %></h2>
<h3>應用程式次數:<%=appCount %></h3>
</body>
</html>
當我們第一次在我的Edge瀏覽器發送請求:

然后我不關閉我的瀏覽器再重繪兩次,相當于發送兩次請求:


接下來我換成我的IE瀏覽器請求兩次:


然后我再關閉掉IE瀏覽器,重新打開,請求兩次


我再把服務端關掉,然后再打開,期間不關閉我的IE瀏覽器,然后再再我的IE瀏覽器請求兩次,


從上我們是不是能從這些現象分析出三個原理:
- 當我在我的Edge瀏覽器運行三次時,會話次數和應用程式次數都加了三次,唯獨頁面次數為1,因為每一次重繪都是一個新的頁面,它不是一直是1,而是一個個新的1,反映了pageContext資料只作用于一個頁面;
- 當我在我的另一個瀏覽器IE瀏覽器請求兩次后,頁面次數重新開始加為2,而應用程式次數還是基于在Edge上的瀏覽器的數值往上加,反映了session物件資料只作用于一個瀏覽器(客戶端),不同的瀏覽器是不同的會話,只要瀏覽器不關閉,資料一直保存,
- 當我關閉掉服務端再打開,期間不關閉我的IE瀏覽器,再在我的IE瀏覽器請求兩次,應用程式次數清零重新開始加,而會話次數還是基于之前的數值加,反映了application物件作用于整個服務器,只要服務器不關閉,資料一直保存
- 還有一個值得注意的是,即使我們的服務端關閉了,只要我們的瀏覽器(客戶端)沒有關閉,那我們的瀏覽器的資料還是會保存在session物件中,從而也能反映出服務端的關閉對客戶端的資料沒有影響,可以看作session物件存盤資料只存盤于瀏覽器,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/239687.html
標籤:其他
上一篇:前端小案例之3D導航欄
