最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JSP中 Session和作用域的使用

 更新時(shí)間:2013年04月22日 10:30:53   投稿:jingxian  
本篇文章小編為大家介紹,JSP中 Session和作用域的使用。需要的朋友參考下

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

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

page在當(dāng)前頁面有效(僅用于JSP中)
request在當(dāng)前請求中有效
session在當(dāng)前會(huì)話中有效
application在所有應(yīng)用程序中有效
requestHTTP請求開始到結(jié)束這段時(shí)間
sessionHTTP會(huì)話開始到結(jié)束這段時(shí)間
application服務(wù)器啟動(dòng)到停止這段時(shí)間

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

Servlet之間的信息共享是通過HttpServletRequest接口的兩個(gè)方法來實(shí)現(xiàn)的:

void setAttribute(String name, Object value)

將對象 value 以 name 為名稱保存到request作用域中。

Object getAttribute(String name)

從request作用域中取得指定名字的信息。

doGet()、doPost()函數(shù)的第一個(gè)參數(shù)就是 HttpServletRequest 對象, 使用這個(gè)對象的 setAttribute 即可傳遞信息。

那么設(shè)置好信息之后,如何將信息傳給其他Servlet? 這就要用到 RequestDispatcher 接口的 forward 方法,將請求轉(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è)請求只能由一個(gè)PHP文件來處理,所以PHP中根本沒有request作用域的概念。 而Servlet則不同,請求可以在應(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ā)對瀏覽器是透明的,也就是說,無論在服務(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對象。

HttpSession HttpServletRequest.getSession()

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

session的開始容易判斷(瀏覽器發(fā)出第一個(gè)HTTP請求即可認(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)接口
requestHTTP請求內(nèi)HttpServletRequest
sessionHTTP會(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)容作用域
DoLoginLoginSuccess登錄時(shí)間request
DoLoginSessionTest登錄用戶名session
DoLoginSessionTest系統(tǒng)登錄次數(shù)application


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

示例下載:session-test_jb51net.zip

相關(guān)文章

最新評論

石泉县| 凤翔县| 甘孜县| 德阳市| 望江县| 凌云县| 福安市| 紫阳县| 惠东县| 清流县| 安龙县| 徐闻县| 梅河口市| 古浪县| 石城县| 车险| 修水县| 洛南县| 紫云| 安阳市| 澄城县| 启东市| 屏山县| 观塘区| 武威市| 横山县| 迁西县| 平果县| 莱西市| 内乡县| 会昌县| 河津市| 平遥县| 镇远县| 夏邑县| 泗洪县| 宣化县| 涟水县| 陇南市| 淅川县| 新乡市|