JSP中 Session和作用域的使用
幾乎所有的Web開發(fā)語言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通過作用域(scope)這個(gè)概念來實(shí)現(xiàn)的。
作用域分為四種,分別為:
page | 在當(dāng)前頁面有效(僅用于JSP中) |
request | 在當(dāng)前請(qǐng)求中有效 |
session | 在當(dāng)前會(huì)話中有效 |
application | 在所有應(yīng)用程序中有效 |
是不是看不太明白?page因?yàn)閮H用于JSP中,這里只講述其他三種作用域。 首先要聲明的一點(diǎn),所謂“作用域”就是“信息共享的范圍”, 也就是說一個(gè)信息能夠在多大的范圍內(nèi)有效。
話說武松一日來到景陽崗,見一旗幟迎風(fēng)飄揚(yáng),旗子上書五個(gè)大字“三碗不過崗”。 武松叫道:“店家,拿三碗酒來,再切兩斤熟牛肉!”店小二應(yīng)聲道:“三碗好酒, 二斤熟牛肉啰~~”里面廚師趕忙當(dāng)當(dāng)當(dāng)當(dāng)切好牛肉,店小二倒上三碗酒,店小二端上前來。
武松咕咚咕咚連干三碗,叫一聲“好酒!店家,再來三碗!”小二忙又倒上三碗好酒, 武松一飲而盡。就這樣前前后后武松一共喝了十八大腕。付了帳剛要走,店小二道: “客官,這前面山上有大蟲,客官剛剛喝完十八碗酒恐怕過不得崗,不如在小店暫住一夜, 待明天和獵戶一同過崗豈不是好?”
之后武松說什么就留待各位看官自己去回憶啦。在這段武松打虎中, 大家有沒有看到些熟悉的東西?
•武松:瀏覽器。
•酒館: 服務(wù)器。
•店小二、廚師: Servlet或者JSP。
•來三碗好酒!:瀏覽器向服務(wù)器發(fā)出HTTP請(qǐng)求。
•店小二上酒:服務(wù)器的響應(yīng)。
•武松從進(jìn)店到離開: 一個(gè)HTTP會(huì)話(即 Session)。
我們可以看到,Web交互的最基本單位為HTTP請(qǐng)求(‘武松點(diǎn)菜‘)。 每個(gè)用戶從進(jìn)入網(wǎng)站到離開網(wǎng)站這段過程稱為一個(gè)HTTP會(huì)話 (“武松進(jìn)店到出店”),一個(gè)服務(wù)器的運(yùn)行過程中會(huì)有多個(gè)用戶訪問, 就是多個(gè)HTTP會(huì)話(“酒館當(dāng)然不可能只接待武松一個(gè)客人”)。 那么作用域就可以理解為:
request | HTTP請(qǐng)求開始到結(jié)束這段時(shí)間 |
session | HTTP會(huì)話開始到結(jié)束這段時(shí)間 |
application | 服務(wù)器啟動(dòng)到停止這段時(shí)間 |
request
一個(gè)HTTP請(qǐng)求的處理可能需要多個(gè)Servlet合作(“武松點(diǎn)菜時(shí)店小二就要吩咐廚房做菜”), 幾個(gè)Servlet之間可以通過某種方式傳遞信息(“店小二就用吆喝的方式通知廚房”), 但這個(gè)信息在請(qǐng)求結(jié)束后就無效了(“廚房在做完菜之后就不用再管這道菜的事兒了”)。
Servlet之間的信息共享是通過HttpServletRequest接口的兩個(gè)方法來實(shí)現(xiàn)的:
void setAttribute(String name, Object value)
將對(duì)象 value 以 name 為名稱保存到request作用域中。
Object getAttribute(String name)
從request作用域中取得指定名字的信息。
doGet()、doPost()函數(shù)的第一個(gè)參數(shù)就是 HttpServletRequest 對(duì)象, 使用這個(gè)對(duì)象的 setAttribute 即可傳遞信息。
那么設(shè)置好信息之后,如何將信息傳給其他Servlet? 這就要用到 RequestDispatcher 接口的 forward 方法,將請(qǐng)求轉(zhuǎn)發(fā)給其他Servlet。
RequestDispatcher ServletContext.getRequestDispatcher(String path)
取得Dispatcher以便轉(zhuǎn)發(fā)。path為轉(zhuǎn)發(fā)的目的Servlet。
void RequestDispatcher.forward(ServletRequest request, ServletResponse response)
將request和response轉(zhuǎn)發(fā)。
因此,只要在當(dāng)前Servlet中先 setAttribute,然后forward,最后在forward到的Servlet中 getAttribute即可實(shí)現(xiàn)信息傳遞。
PHP的程序員可能不太好理解這一段,因?yàn)镻HP中沒有轉(zhuǎn)發(fā)的概念, 一個(gè)請(qǐng)求只能由一個(gè)PHP文件來處理,所以PHP中根本沒有request作用域的概念。 而Servlet則不同,請(qǐng)求可以在應(yīng)用程序中任意轉(zhuǎn)發(fā),所以用request作用域在不同Servlet之間傳遞信息。 需要注意兩點(diǎn):
1.轉(zhuǎn)發(fā)不是重定向,轉(zhuǎn)發(fā)是在Web應(yīng)用內(nèi)部進(jìn)行的。PHP支持重定向但沒有轉(zhuǎn)發(fā)。
2.轉(zhuǎn)發(fā)對(duì)瀏覽器是透明的,也就是說,無論在服務(wù)器上如何轉(zhuǎn)發(fā),瀏覽器地址欄中顯示的仍然是最初那個(gè)Servlet的地址。
session
session作用域比較容易理解,同一瀏覽器訪問多次,在這多次訪問之間傳遞信息,就是session作用域。 (武松每次點(diǎn)菜,帳房先生都要記一筆賬,等武松走之前結(jié)帳用。 這筆帳在武松吃飯過程中始終有效,即位于session作用域中)
session是通過HttpSession接口實(shí)現(xiàn)的。
Object HttpSession.getAttribute(String name)
從session中獲取信息
void HttpSession.setAttribute(String name, Object value)
向session中保存信息
而通過HttpServletRequest.getSession()方法可以獲得HttpSession對(duì)象。
HttpSession HttpServletRequest.getSession()
獲取當(dāng)前請(qǐng)求所在的session的對(duì)象。
session的開始容易判斷(瀏覽器發(fā)出第一個(gè)HTTP請(qǐng)求即可認(rèn)為會(huì)話開始), 但結(jié)束就不好判斷了(因?yàn)闉g覽器關(guān)閉時(shí)不會(huì)通知服務(wù)器“我關(guān)了,會(huì)話可以結(jié)束了”), 所以只能通過這種方法判斷:如果一定的時(shí)間內(nèi)客戶端沒有反應(yīng),則認(rèn)為會(huì)話結(jié)束。 Tomcat的默認(rèn)值為120分鐘,但這個(gè)值也可以通過 HttpSession 的 setMaxInactiveInterval() 方法來設(shè)置。
void setMaxInactiveInterval(int interval)
設(shè)置會(huì)話的超時(shí)值。
如果想主動(dòng)讓會(huì)話結(jié)束,如用戶單擊“注銷”的時(shí)候,可以使用HttpSession 的 invalidate() 方法:
void invalidate()
強(qiáng)制結(jié)束當(dāng)前session。
application
application作用域就是服務(wù)器啟動(dòng)到關(guān)閉的整段時(shí)間, 在這個(gè)作用域內(nèi)設(shè)置的信息可以被所有應(yīng)用程序使用。 (餐館打烊后結(jié)帳,用到的即是開張到打烊之間的所有信息。)
還記得上一節(jié)提到的ServetContext嗎? application作用域上的信息傳遞就是通過ServetContext實(shí)現(xiàn)的。
Object getAttribute(String name)
從application中獲取信息。
void setAttribute(String name, Object value)
向application作用域中設(shè)置信息。
總結(jié)
可以看到,每個(gè)作用域除了實(shí)現(xiàn)接口不同、意義不同之外,它們的使用方法和作用都是相同的, 都是通過 getAttribute 和 setAttribute 方法進(jìn)行信息傳遞。
作用域 | 意義 | 實(shí)現(xiàn)接口 |
request | HTTP請(qǐng)求內(nèi) | HttpServletRequest |
session | HTTP會(huì)話內(nèi) | HttpSession |
application | 服務(wù)器生命周期內(nèi) | ServletContext |
示例程序
示例程序
這一節(jié)的示例程序是一個(gè)用戶登錄的模擬程序。文件較多。
•login.html 登錄表單
•DoLogin.java 處理登錄動(dòng)作的Servlet
•LoginSuccess.java 用于顯示登錄成功信息的Servlet
•SessionTest.java 登錄后的處理程序
•DoLogout.java 注銷的處理程序
為了演示 request、application、session 各個(gè)作用域的使用方法, Servlet之間進(jìn)行了數(shù)據(jù)傳遞,數(shù)據(jù)傳遞方式如下:
數(shù)據(jù)產(chǎn)生 | 數(shù)據(jù)接受 | 數(shù)據(jù)內(nèi)容 | 作用域 |
DoLogin | LoginSuccess | 登錄時(shí)間 | request |
DoLogin | SessionTest | 登錄用戶名 | session |
DoLogin | SessionTest | 系統(tǒng)登錄次數(shù) | application |
訪問 http://localhost:8080/LearnJSP/sessiontest, 登錄時(shí)輸入用戶名 charlee 和密碼 123456 即可。
- 利用JSP session對(duì)象保持住登錄狀態(tài)
- JavaWeb實(shí)現(xiàn)用戶登錄注冊功能實(shí)例代碼(基于Servlet+JSP+JavaBean模式)
- JSP實(shí)現(xiàn)用戶登錄、注冊和退出功能
- JSP制作簡單登錄界面實(shí)例
- JSP實(shí)現(xiàn)簡單的用戶登錄并顯示出用戶信息的方法
- JSP中實(shí)現(xiàn)系統(tǒng)登錄后的退出原理及代碼
- JSP+MySQL實(shí)現(xiàn)網(wǎng)站的登錄與注冊小案例
- JSP實(shí)現(xiàn)登錄功能之添加驗(yàn)證碼
- JSP + Servlet實(shí)現(xiàn)生成登錄驗(yàn)證碼示例
- jsp獲取action傳來的session和session清空以及判斷
- JSP登錄中Session的用法實(shí)例詳解
相關(guān)文章
Java 實(shí)現(xiàn) web服務(wù)器的簡單實(shí)例
這篇文章主要介紹了Java 實(shí)現(xiàn) web服務(wù)器的簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06Eclipse開發(fā)Hibernate應(yīng)用程序
Eclipse開發(fā)Hibernate應(yīng)用程序...2006-10-10jsp中為表格添加水平滾動(dòng)條的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨sp中為表格添加水平滾動(dòng)條的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10