佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > JSP中 Session和作用域的使用

JSP中 Session和作用域的使用

熱門標(biāo)簽:Linux服務(wù)器 Mysql連接數(shù)設(shè)置 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 服務(wù)器配置 團(tuán)購(gòu)網(wǎng)站 銀行業(yè)務(wù) 阿里云 電子圍欄

幾乎所有的Web開(kāi)發(fā)語(yǔ)言都支持Session功能,Servlet也不例外。 Servlet/JSP中的Session功能是通過(guò)作用域(scope)這個(gè)概念來(lái)實(shí)現(xiàn)的。

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

page 在當(dāng)前頁(yè)面有效(僅用于JSP中)
request 在當(dāng)前請(qǐng)求中有效
session 在當(dāng)前會(huì)話中有效
application 在所有應(yīng)用程序中有效

是不是看不太明白?page因?yàn)閮H用于JSP中,這里只講述其他三種作用域。 首先要聲明的一點(diǎn),所謂“作用域”就是“信息共享的范圍”, 也就是說(shuō)一個(gè)信息能夠在多大的范圍內(nèi)有效。

話說(shuō)武松一日來(lái)到景陽(yáng)崗,見(jiàn)一旗幟迎風(fēng)飄揚(yáng),旗子上書五個(gè)大字“三碗不過(guò)崗”。 武松叫道:“店家,拿三碗酒來(lái),再切兩斤熟牛肉!”店小二應(yīng)聲道:“三碗好酒, 二斤熟牛肉啰~~”里面廚師趕忙當(dāng)當(dāng)當(dāng)當(dāng)切好牛肉,店小二倒上三碗酒,店小二端上前來(lái)。

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

之后武松說(shuō)什么就留待各位看官自己去回憶啦。在這段武松打虎中, 大家有沒(méi)有看到些熟悉的東西?

•武松:瀏覽器。
•酒館: 服務(wù)器。
•店小二、廚師: Servlet或者JSP。
•來(lái)三碗好酒?。簽g覽器向服務(wù)器發(fā)出HTTP請(qǐng)求。
•店小二上酒:服務(wù)器的響應(yīng)。
•武松從進(jìn)店到離開(kāi): 一個(gè)HTTP會(huì)話(即 Session)。
我們可以看到,Web交互的最基本單位為HTTP請(qǐng)求(‘武松點(diǎn)菜‘)。 每個(gè)用戶從進(jìn)入網(wǎng)站到離開(kāi)網(wǎng)站這段過(guò)程稱為一個(gè)HTTP會(huì)話 (“武松進(jìn)店到出店”),一個(gè)服務(wù)器的運(yùn)行過(guò)程中會(huì)有多個(gè)用戶訪問(wèn), 就是多個(gè)HTTP會(huì)話(“酒館當(dāng)然不可能只接待武松一個(gè)客人”)。 那么作用域就可以理解為:

request HTTP請(qǐng)求開(kāi)始到結(jié)束這段時(shí)間
session HTTP會(huì)話開(kāi)始到結(jié)束這段時(shí)間
application 服務(wù)器啟動(dòng)到停止這段時(shí)間

request
一個(gè)HTTP請(qǐng)求的處理可能需要多個(gè)Servlet合作(“武松點(diǎn)菜時(shí)店小二就要吩咐廚房做菜”), 幾個(gè)Servlet之間可以通過(guò)某種方式傳遞信息(“店小二就用吆喝的方式通知廚房”), 但這個(gè)信息在請(qǐng)求結(jié)束后就無(wú)效了(“廚房在做完菜之后就不用再管這道菜的事兒了”)。

Servlet之間的信息共享是通過(guò)HttpServletRequest接口的兩個(gè)方法來(lái)實(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中沒(méi)有轉(zhuǎn)發(fā)的概念, 一個(gè)請(qǐng)求只能由一個(gè)PHP文件來(lái)處理,所以PHP中根本沒(méi)有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支持重定向但沒(méi)有轉(zhuǎn)發(fā)。
2.轉(zhuǎn)發(fā)對(duì)瀏覽器是透明的,也就是說(shuō),無(wú)論在服務(wù)器上如何轉(zhuǎn)發(fā),瀏覽器地址欄中顯示的仍然是最初那個(gè)Servlet的地址。

session
session作用域比較容易理解,同一瀏覽器訪問(wèn)多次,在這多次訪問(wèn)之間傳遞信息,就是session作用域。 (武松每次點(diǎn)菜,帳房先生都要記一筆賬,等武松走之前結(jié)帳用。 這筆帳在武松吃飯過(guò)程中始終有效,即位于session作用域中)

session是通過(guò)HttpSession接口實(shí)現(xiàn)的。

Object HttpSession.getAttribute(String name)

從session中獲取信息

void HttpSession.setAttribute(String name, Object value)

向session中保存信息

而通過(guò)HttpServletRequest.getSession()方法可以獲得HttpSession對(duì)象。

HttpSession HttpServletRequest.getSession()

獲取當(dāng)前請(qǐng)求所在的session的對(duì)象。

session的開(kāi)始容易判斷(瀏覽器發(fā)出第一個(gè)HTTP請(qǐng)求即可認(rèn)為會(huì)話開(kāi)始), 但結(jié)束就不好判斷了(因?yàn)闉g覽器關(guān)閉時(shí)不會(huì)通知服務(wù)器“我關(guān)了,會(huì)話可以結(jié)束了”), 所以只能通過(guò)這種方法判斷:如果一定的時(shí)間內(nèi)客戶端沒(méi)有反應(yīng),則認(rèn)為會(huì)話結(jié)束。 Tomcat的默認(rèn)值為120分鐘,但這個(gè)值也可以通過(guò) HttpSession 的 setMaxInactiveInterval() 方法來(lái)設(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é)帳,用到的即是開(kāi)張到打烊之間的所有信息。)

還記得上一節(jié)提到的ServetContext嗎? application作用域上的信息傳遞就是通過(guò)ServetContext實(shí)現(xiàn)的。

Object getAttribute(String name)

從application中獲取信息。

void setAttribute(String name, Object value)

向application作用域中設(shè)置信息。

總結(jié)
可以看到,每個(gè)作用域除了實(shí)現(xiàn)接口不同、意義不同之外,它們的使用方法和作用都是相同的, 都是通過(guò) 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

訪問(wèn) http://localhost:8080/LearnJSP/sessiontest, 登錄時(shí)輸入用戶名 charlee 和密碼 123456 即可。

示例下載:session-test_jb51net.zip

您可能感興趣的文章:
  • 利用JSP session對(duì)象保持住登錄狀態(tài)
  • JavaWeb實(shí)現(xiàn)用戶登錄注冊(cè)功能實(shí)例代碼(基于Servlet+JSP+JavaBean模式)
  • JSP實(shí)現(xiàn)用戶登錄、注冊(cè)和退出功能
  • JSP制作簡(jiǎn)單登錄界面實(shí)例
  • JSP實(shí)現(xiàn)簡(jiǎn)單的用戶登錄并顯示出用戶信息的方法
  • JSP中實(shí)現(xiàn)系統(tǒng)登錄后的退出原理及代碼
  • JSP+MySQL實(shí)現(xiàn)網(wǎng)站的登錄與注冊(cè)小案例
  • JSP實(shí)現(xiàn)登錄功能之添加驗(yàn)證碼
  • JSP + Servlet實(shí)現(xiàn)生成登錄驗(yàn)證碼示例
  • jsp獲取action傳來(lái)的session和session清空以及判斷
  • JSP登錄中Session的用法實(shí)例詳解

標(biāo)簽:衢州 萍鄉(xiāng) 蚌埠 棗莊 江蘇 廣元 大理 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《JSP中 Session和作用域的使用》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    塔城市| 仲巴县| 汝阳县| 大化| 鄂温| 延安市| 安岳县| 渑池县| 女性| 道孚县| 襄樊市| 大庆市| 长葛市| 苗栗县| 吴江市| 临颍县| 措勤县| 永春县| 江北区| 西乡县| 黎城县| 都昌县| 海丰县| 瑞金市| 益阳市| 湘乡市| 九江市| 牡丹江市| 黑龙江省| 洮南市| 调兵山市| 通化市| 特克斯县| 巴南区| 西平县| 贡山| 崇阳县| 开化县| 泗水县| 云梦县| 高陵县|