何為作用域
先讓我們看看效果:
大概流程是這樣的,我們訪問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就可以操作其他三個作用域中的變量。