幾乎全部的Web開發語言都支持Session功能,Servlet也不例外。Servlet/JSP中的Session功能就是經過做用域(scope)這個概念來實現的。 程序員
做用域分爲四種,分別爲: 瀏覽器
Page:在當前頁面有效(僅用於JSP中)
Request:在當前請求中有效
Session:在當前會話中有效
Application:在全部應用程序中有效
是否是看不太明白?page由於僅用於JSP中,這裏只講述其餘三種做用域。首先要聲明的一點,所謂「做用域」就是「信息共享的範圍」,也就是說一個信息可以在多大的範圍內有效。
話說武松一日來到景陽崗,見一旗幟迎風飄揚,旗子上書五個大字「三碗不過崗」。武松叫道:「店家,拿三碗酒來,再切兩斤熟牛肉!」店小二應聲道:「三碗好酒,二斤熟牛肉囉~~」裏面廚師趕緊噹噹噹當切好牛肉,店小二倒上三碗酒,店小二端上前來。
武松咕咚咕咚連幹三碗,叫一聲「好酒!店家,再來三碗!」小二忙又倒上三碗好酒,武松一飲而盡。就這樣前先後後武松一共喝了十八大腕。付了賬剛要走,店小二道: 「客官,這前面山上有大蟲,客官剛剛喝完十八碗酒恐怕過不得崗,不如在小店暫住一晚上,待明天和獵戶一同過崗豈不是好?」
以後武松說什麼就留待各位看官本身去回憶啦。在這段武松打虎中,你們有沒有看到些熟悉的東西?
·
武松: 瀏覽器。
·
酒館: 服務器。
·
店小2、廚師: Servlet或者JSP。
·
來三碗好酒!: 瀏覽器向服務器發出HTTP請求。
·
店小二上酒: 服務器的響應。
·
武松從進店到離開: 一個HTTP對話。
咱們能夠看到,Web交互的最基本單位爲HTTP請求(武松點菜)。每一個用戶從進入網站到離開網站這段過程稱爲一個HTTP會話 (武松進店到出店),一個服務器的運行過程當中會有多個用戶訪問,就是多個HTTP會話(酒館固然不可能只接待武松一個客人)。那麼做用域就能夠理解爲:
Request:HTTP請求開始到結束這段時間
Session:HTTP會話開始到結束這段時間
Application:服務器啓動到中止這段時間
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做用域中''')
session是經過HttpSession接口實現的。
Object HttpSession.getAttribute(String name)
從session中獲取信息
void HttpSession.setAttribute(String name, Object value)
向session中保存信息
而經過HttpServletRequest.getSession()方法能夠得到HttpSession對象。
HttpSession HttpServletRequest.getSession()
獲取當前請求所在的session的對象。
session的開始容易判斷(瀏覽器發出第一個HTTP請求便可認爲會話開始),但結束就很差判斷了(由於瀏覽器關閉時不會通知服務器「我關了,會話能夠結束了」),因此只能經過這種方法判斷:若是必定的時間內客戶端沒有反應,則認爲會話結束。Tomcat的默認值爲120分鐘,但這個值也能夠經過HttpSession 的 setMaxInactiveInterval 方法來設置。
void setMaxInactiveInterval(int interval)
設置繪畫的超時值。
若是想主動讓會話結束,如用戶單擊「註銷」的時候,可使用 HttpSession 的 invalidate方法:
void invalidate()
強制結束當前session。
application app
application做用域就是服務器啓動到關閉的整段時間,在這個做用域內設置的信息能夠被全部應用程序使用。 (餐館打烊後結賬,用到的便是開張到打烊之間的全部信息。) 函數
application做用域上的信息傳遞就是經過ServetContext實現的。 網站
Object getAttribute(String name)
從application中獲取信息。 spa
void setAttribute(String name, Object value)
向application做用域中設置信息。