1.簡單說 page指當前頁面。在一個jsp頁面里有效
2.request 指從http請求到服務器處理結束,返回響應的整個過程。在這個過程中使用forward方式跳轉多個jsp。在這些頁面里你都可以使用這個變量。
3.Session 有效范圍當前會話,從瀏覽器打開到瀏覽器關閉這個過程。
4.application它的有效范圍是整個應用。
作用域里的變量,它們的存活時間是最長的,如果不進行手工刪除,它們就一直可以使用
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都是完全隔離的,無論如何修改都不會影響其他人的數據。
問題:page、request、session、application的作用范圍?
書中解答,此處只摘錄重要語句:
page:用戶請求的當前頁面;
Request:用戶請求訪問的當前組件,以及和當前web組件共享同一用戶請求的web組件。如:被請求的jsp頁面和該頁面用<include>指令包含的頁面以及<forward>標記包含的其它jsp頁面;
Session:同一個http會話中的web組件共享它;
Application:整個web應用的所用web組件共享它。
此處我舉個例子說明
一個網站MyWebSite,其包含7個jsp頁面,分別為master.jsp、top.jsp、main.jsp、foot.jsp、login.jsp、success.jsp和news.jsp。master.jsp頁面通過<include>指令包含top.jsp、main.jsp、foot.jsp三個頁面,當用戶通過login.jsp登錄成功后,進入success.jsp頁面然后通過此頁面的<forward>標簽跳轉到master.jsp頁面中。
我們在success.jsp頁面中加入如下代碼(此處用到jstl標簽)
<c:set value="aaa" var="test1" scope=”page” />
<c:set value="aaa" var="test2" scope=”request” />
<c:set value="aaa" var="test3" scope=”session” />
<c:set value="aaa" var="test4" scope=”application” />
<jsp:forward page=”master.jsp”/ >這里一一說明
1.變量 test1 只在success.jsp內有效;
2.變量 test2 在success.jsp、master.jsp、top.jsp、main.jsp、foot.jsp中有效;
3.變量 test3 在7個頁面中都有效(包括login.jsp和news.jsp);
4.變量 test4 在整個網站,當前也就是7個頁面中都有效(包括login.jsp和news.jsp)。
Test3和test4有效范圍一樣,有什么區別呢?
其實區別蠻大的,我只說明一點,假如此時又有另一個用戶訪問master.jsp頁面,那么test3相對於這個用戶來說就無效,而test4卻是有效的。或者當第一個登錄的用戶關閉瀏覽器后,再重新訪問master.jsp時,test3就無效,而test4卻有效。