1. 程式人生 > >JSP中的四大作用域

JSP中的四大作用域

什麼是作用域?

我們在寫程式碼的時候,都會遇到變數的作用域的問題;比如這是一個區域性變數,出了它的作用域就無法訪問了。對於作用域的概念,最簡單的理解就是:

在你的地盤,你還算根蔥;出了你的地盤,你啥也不是。

我們在定義每一個變數,每一個屬性的時候,都會考慮這個變數、屬性的作用範圍,也就是作用域。我們會根據我們的需求定義最適當作用域內的變數和屬性。在寫JavaC++等程式碼的時候,這個作用域問題還比較好理解,無非就是區域性變數、全域性變數、靜態變數等區別。而到了JSP開發中,這個作用域概念就和一些新的名詞混在一起,變的模糊,難懂了起來。這篇文章將對JSP開發中涉及到的四大作用域進行詳細的剖析與總結,還自己一個

明白

JSP中的四大域?

·        page作用域

·        request作用域

·        session作用域

·        application作用域

page作用域詳解

page直譯就是頁面的意思,所以page作用域就比較好理解了——page作用域表示只在當前頁面有效。當程式執行跑出了當前的頁面,你就無法在其它的頁面訪問當前頁面設定的屬性值。

我們都知道,JSP最終會被編譯成Servlet檔案。在Servlet容器中,每個Servlet都只存在一個例項。但是對於page作用域的屬性來說,在當前頁面設定的屬性只在本次訪問該頁面有效,當你再次訪問該頁面時,又會重新初始化頁面的屬性。例如以下程式碼:

<%

out.print(pageContext.getAttribute("SiteName")); //輸出null

pageContext.setAttribute("SiteName", "啦啦啦啦啦");

%>

當我在瀏覽器訪問該頁面時會輸出null;當我再重新開啟一個該頁面時,還會輸出null,並不會輸出果凍想-一個原創技術文章分享網站。也就是說,page作用域範圍的不會存線上程安全的問題,每一次訪問同一個頁面,設定的page作用域的屬性都是不一樣的。

request作用域詳解

request表示一次客戶端的請求。一次請求的生命週期從客戶端發起到伺服器接收並響應該請求,或者將該請求

forward到另一個頁面或者Servlet進行處理而結束。在此期間,本次請求的引數,屬性都是有效的;一旦客戶端重新整理瀏覽器,重新發起請求,則之前的請求引數和屬性都將失效。

特別需要注意的是,當我們使用<jsp:forward .../>動作將當前請求轉向另一個頁面或者Servlet的時候,該請求的引數和屬性也一併轉過去,並不會因為<jsp:forward .../>動作而丟失request的引數和屬性。

session作用域詳解

我一直都在強調session是一個非常重要的概念。當我們向伺服器傳送第一個請求開始,只要頁面不關閉,或者會話未過期(預設30分鐘),或者未呼叫HttpSessioninvalidate()方法,接下來的操作都屬於同一次會話的範疇。

JSP中,每當向伺服器傳送一個請求,伺服器響應這個請求的時候,會在客戶端的Cookie中寫一個session id值。每次傳送請求的時候,會將該sessionid值一起傳送到伺服器端,伺服器端根據該sessionid值來判斷每次請求是否屬於同一個session的範疇之內。

application作用域詳解

application的作用域是最廣的,它代表著整個Web應用的全域性變數,對每一個頁面,每一個Servlet都是有效的。當我們在application中設定屬性時,這個屬性在任意的一個頁面都是可以訪問的。

application作用域中設定的屬性如果不手動呼叫removeAttribute函式進行刪除的話,那麼application中的屬性將永遠不會刪除,如果Web容器發生重啟,此時application範圍內的所有屬性都將丟失。