jsp中作用域scope概念

2021-04-19 19:32:58 字數 3898 閱讀 5721

幾乎所有的web開發語言都支援session功能,servlet也不例外。 servlet/jsp中的session功能是通過作用域(scope)這個概念來實現的。

作用域分為四種,分別為:

page

在當前頁面有效(僅用於jsp中)

request

在當前請求中有效

session

在當前會話中有效

在所有應用程式中有效

是不是看不太明白?page因為僅用於jsp中,這裡只講述其他三種作用域。首先要宣告的一點,所謂「作用域」就是「資訊共享的範圍」,也就是說乙個資訊能夠在多大的範圍內有效。

話說武松一日來到景陽崗,見一旗幟迎風飄揚,旗子上書五個大字「三碗不過崗」。武松叫道:「店家,拿三碗酒來,再切兩斤熟牛肉!」店小二應聲道:「三碗好酒,二斤熟牛肉囉~~」裡面廚師趕忙噹噹當當切好牛肉,店小二倒上三碗酒,店小二端上前來。

武松咕咚咕咚連乾三碗,叫一聲「好酒!店家,再來三碗!」小二忙又倒上三碗好酒,武松一飲而盡。就這樣前前後後武松一共喝了十八大腕。付了帳剛要走,店小二道: 「客官,這前面山上有大蟲,客官剛剛喝完十八碗酒恐怕過不得崗,不如在小店暫住一夜,待明天和獵戶一同過崗豈不是好?」

之後武松說什麼就留待各位看官自己去回憶啦。在這段武松打虎中,大家有沒有看到些熟悉的東西? ·

武松:

瀏覽器。 ·

酒館:

伺服器。 ·

店小

二、廚師: servlet

或者jsp。 ·

來三碗好酒!:

瀏覽器向伺服器發出http請求。 ·

店小二上酒:

伺服器的響應。 ·

武松從進店到離開:

乙個http對話。

我們可以看到,web互動的最基本單位為http請求(武松點菜)。每個使用者從進入**到離開**這段過程稱為乙個http會話(武松進店到出店),乙個伺服器的執行過程中會有多個使用者訪問,就是多個http會話(酒館當然不可能只接待武松乙個客人)。那麼作用域就可以理解為:

請求開始到結束這段時間

會話開始到結束這段時間

伺服器啟動到停止這段時間

request

乙個http請求的處理可能需要多個servlet合作(武松點菜時店小二就要吩咐廚房做菜),幾個servlet之間可以通過某種方式傳遞資訊(店小二就用吆喝的方式通知廚房),但這個資訊在請求結束後就無效了(廚房在做完菜之後就不用再管這道菜的事兒了)。

servlet

之間的資訊共享是通過httpservletrequest介面的兩個方法來實現的:

void setattribute(string name, object value)

將物件 value 以 name 為名稱儲存到request作用域中。

object getattribute(string name)

從request作用域中取得指定名字的資訊。

doget()

、dopost()函式的第乙個引數就是 httpservletrequest 物件,使用這個物件的 setattribute 即可傳遞資訊。

那麼設定好資訊之後,如何將資訊傳給其他servlet?這就要用到 requestdispatcher 介面的 forward 方法,將請求**給其他servlet。

requestdispatcher servletcontext.getrequestdispatcher(string path)

取得dispatcher以便**。path為**的目的servlet。

void requestdispatcher.forward(servletrequest request, servletresponse response)

將request和response**。

因此,只要在當前servlet中先 setattribute,然後forward,最後在forward到的servlet中 getattribute即可實現資訊傳遞。

php的程式設計師可能不太好理解這一段,因為php中沒有**的概念,乙個請求只能由乙個php檔案來處理,所以php中根本沒有request作用域的概念。而servlet則不同,請求可以在應用程式中任意**,所以用request作用域在不同servlet之間傳遞資訊。需要注意兩點: 1.

**不是重定向,**是在web應用內部進行的。php支援重定向但沒有**。 2.

**對瀏覽器是透明的,也就是說,無論在伺服器上如何**,瀏覽器位址列中顯示的仍然是最初那個servlet的位址。

session

session

作用域比較容易理解,同一瀏覽器訪問多次,在這多次訪問之間傳遞資訊,就是session作用域。 ('''武松每次點菜帳房先生都要記一筆賬,等武松走之前結帳用。這筆帳在武松吃飯過程中始終有效,即位於session作用域中''')

session

是通過httpsession介面實現的。

從session中獲取資訊

向session中儲存資訊

而通過httpservletrequest.getsession()方法可以獲得httpsession物件。

獲取當前請求所在的session的物件。

session

的開始容易判斷(瀏覽器發出第乙個http請求即可認為會話開始),但結束就不好判斷了(因為瀏覽器關閉時不會通知伺服器「我關了,會話可以結束了」),所以只能通過這種方法判斷:如果一定的時間內客戶端沒有反應,則認為會話結束。 tomcat的預設值為120分鐘,但這個值也可以通過 httpsession 的 setmaxinactiveinterval 方法來設定。

void setmaxinactiveinterval(int interval)

設定繪畫的超時值。

如果想主動讓會話結束,如使用者單擊「登出」的時候,可以使用 httpsession 的 invalidate 方法:

vooid invalidate()

強制結束當前session。

作用域就是伺服器啟動到關閉的整段時間,在這個作用域內設定的資訊可以被所有應用程式使用。 (餐館打烊後結帳,用到的即是開張到打烊之間的所有資訊。)

作用域上的資訊傳遞就是通過servetcontext實現的。

object getattribute(string name)

void setattribute(string name, object value)

總結

可以看到,每個作用域除了實現介面不同、意義不同之外,它們的使用方法和作用都是相同的,都是通過 getattribute 和 setattribute 方法進行資訊傳遞。

作用域意義實現介面

請求內httpservletrequest

會話內httpsession

伺服器生命週期內

servletcontext

spring中scope作用域

今天研究了一下scope的作用域。預設是單例模式,即scope singleton 另外scope還有prototype request session global session作用域。scope prototype 多例。再配置bean的作用域時,它的標頭檔案形式如下 接著既可以配置bean的...

Scope的作用域

scope描述的是sring容器如何新建bean的例項。spring的scope有以下幾種,通過 scope註解來實現 1 scope singleton 乙個spring容器中只有乙個bean的例項,為spring的預設配置,全容器共享乙個例項。這個單一例項會被儲存到單例快取中,並且所有針對該be...

AngularJs中的作用域Scope

作用域 scope index.html your name greet script.js function mycontroller scope 控制器 mycontroller,它引用了 scope並在其上註冊了兩個屬性和乙個方法 scope 物件 持有上面例子所需的資料模型,包括userna...