天天看點

page、request、session和application差別 及各自作用域

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卻有效。 

轉自:http://liuyuru.iteye.com/blog/773367

jsp