程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> JSP的四個作用域

JSP的四個作用域

編輯:關於JSP

何為作用域
先讓我們看看效果:


大概流程是這樣的,我們訪問04-01/index.jsp的時候,分別對pageContext, request, session,

application四個作用域中的變量進行累加。(當然先判斷這個變量是不是存在,如果變量不存在,則要

把變量初始化成1。)計算完成後就從index.jsp執行forward跳轉到test.jsp。在test.jsp裡再進行一次

累加,然後顯示出這四個整數來。

從顯示的結果來看,我們可以直觀的得出結論:

page裡的變量沒法從index.jsp傳遞到test.jsp。只要頁面跳轉了,它們就不見了。

request裡的變量可以跨越forward前後的兩頁。但是只要刷新頁面,它們就重新計算了。

session和application裡的變量一直在累加,開始還看不出區別,只要關閉浏覽器,再次重啟浏覽器訪問

這頁,session裡的變量就重新計算了。

application裡的變量一直在累加,除非你重啟tomcat,否則它會一直變大。

而作用域規定的是變量的有效期限。

如果把變量放到pageContext裡,就說明它的作用域是page,它的有效范圍只在當前jsp頁面裡。

從把變量放到pageContext開始,到jsp頁面結束,你都可以使用這個變量。

如果把變量放到request裡,就說明它的作用域是request,它的有效范圍是當前請求周期。

所謂請求周期,就是指從http請求發起,到服務器處理結束,返回響應的整個過程。在這個過程中可能使

用forward的方式跳轉了多個jsp頁面,在這些頁面裡你都可以使用這個變量。

如果把變量放到session裡,就說明它的作用域是session,它的有效范圍是當前會話。

所謂當前會話,就是指從用戶打開浏覽器開始,到用戶關閉浏覽器這中間的過程。這個過程可能包含多個

請求響應。也就是說,只要用戶不關浏覽器,服務器就有辦法知道這些請求是一個人發起的,整個過程被

稱為一個會話(session),而放到會話中的變量,就可以在當前會話的所有請求裡使用。

如果把變量放到application裡,就說明它的作用域是application,它的有效范圍是整個應用。

整個應用是指從應用啟動,到應用結束。我們沒有說“從服務器啟動,到服務器關閉”,是因為一個服務

器可能部署多個應用,當然你關閉了服務器,就會把上面所有的應用都關閉了。

application作用域裡的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用。

與上述三個不同的是,application裡的變量可以被所有用戶共用。如果用戶甲的操作修改了application

中的變量,用戶乙訪問時得到的是修改後的值。這在其他scope中都是不會發生的,page, request,

session都是完全隔離的,無論如何修改都不會影響其他人的數據。

我們使用public Object getAttribute(String name)獲得變量值,使用public void setAttribute

(String name, Object value)將變量值保存到對應作用域中。舉個pageContext的例子就是:

// page
Integer countPage = (Integer) pageContext.getAttribute("countPage");
if (countPage == null) {
    pageContext.setAttribute("countPage", 1);
} else {
    pageContext.setAttribute("countPage", countPage + 1);
}
這裡先從pageContext中取出名為countPage的整數,因為返回的都是java.lang.Object類型,所以需要強

制轉換成我們需要的整形。這裡取得的變量如果不存在就會返回null,通過判斷countPage == null來辨

別變量是否存在,如果不存在就設置為1,如果存在就進行累加,最後使用setAttribute()方法將修改後

的變量值放入pageContext。

將其中的pageContext換成request, session, application就可以操作其他三個作用域中的變量。 


摘自 gdn_wolf的專欄 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved