幾乎所有的web開發語言都支援session功能,servlet也不例外。 servlet/jsp中的session功能是通過作用域(scope)這個概念來實現的。
作用域分為四種,分別為:
是不是看不太明白?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之間傳遞資訊。 需要注意兩點:
**不是重定向,**是在web應用內部進行的。php支援重定向但沒有**。
**對瀏覽器是透明的,也就是說,無論在伺服器上如何**,瀏覽器位址列中顯示的仍然是最初那個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 方法:
可以看到,每個作用域除了實現介面不同、意義不同之外,它們的使用方法和作用都是相同的, 都是通過 getattribute 和 setattribute 方法進行資訊傳遞。
作用域理解
例1如下 include int main while test 5 域外 printf n域外 test d t域外 p n test,test return 0 執行結果如下 lnz lnz c test gcc action scope.c lnz lnz c test a.out 域外 te...
Servlet三大作用域
1.request request表示乙個請求,只要發出乙個請求就會建立乙個request,它的作用域僅在當前請求中有效,如果web元件之間需要共享同乙個請求中的資料,只能使用請求 用處 用於伺服器間同一請求不同頁面之間的引數傳遞 用於表單的控制項值傳遞 常用方法 2.session 伺服器為每個會...
Js作用域理解
如何理解 changecolor 函式可以訪問作用域 global scope changecolor scope自己作用域 swapcolor 函式可以訪問作用域 global scope changecolor scope外層函式 和swapcolor scope作用域 如何某乙個變數在當前函式...