監(jiān)聽(tīng)器的定義
(專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽(tīng)和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生變化時(shí),立即采取相應(yīng)的行動(dòng))
定義:Servlet規(guī)范中定義的一種特殊的類掩缓,用于監(jiān)聽(tīng)ServletContext睛藻、HttpSession和ServletRequest等域?qū)ο蟮膭?chuàng)建與銷毀時(shí)間蓄诽,以及用于監(jiān)聽(tīng)域?qū)ο蟮膶傩园l(fā)生修改的事件功偿,監(jiān)聽(tīng)器對(duì)象可以在事件發(fā)生前、發(fā)生后做一些必要的處理
WEB應(yīng)用中的監(jiān)聽(tīng)器:
由Servlet規(guī)范提供的座慰,可以監(jiān)視客戶端的請(qǐng)求以及服務(wù)端的操作陨舱,同時(shí)可以監(jiān)視1.ServletContext(application,容器創(chuàng)建并且初始化的版仔,范圍整個(gè)Web應(yīng)用游盲,整個(gè)Web應(yīng)用只有一個(gè)application對(duì)象,Web容器關(guān)閉就會(huì)銷毀application對(duì)象)蛮粮、
2.HttpSession(session益缎,是一種保存上下文的機(jī)制,針對(duì)每一個(gè)會(huì)話然想,放在服務(wù)器端莺奔,通過(guò)session的id進(jìn)行區(qū)分的,瀏覽器和服務(wù)器結(jié)束后变泄,就會(huì)把session進(jìn)行銷毀)令哟、
3.ServletRequest(request恼琼,客戶發(fā)送請(qǐng)求時(shí),容器就會(huì)創(chuàng)建一個(gè)ServletRequest對(duì)象屏富,進(jìn)行封裝請(qǐng)求數(shù)據(jù)晴竞,同時(shí)會(huì)創(chuàng)建一個(gè)ServletResponse對(duì)象,進(jìn)行封裝響應(yīng)數(shù)據(jù)狠半,訪問(wèn)請(qǐng)求結(jié)束之后噩死,request對(duì)象就會(huì)被銷毀)。
第一個(gè)監(jiān)聽(tīng)器案例
步驟1:創(chuàng)建一個(gè)類并實(shí)現(xiàn)ServletContextListener接口(javax.servlet),并且實(shí)現(xiàn)了contextInitialized方法和contextDestroyed方法
步驟2:web.xml配置監(jiān)聽(tīng)對(duì)象
監(jiān)聽(tīng)器的啟動(dòng)順序
注冊(cè)順序加載監(jiān)聽(tīng)器神年,如果注冊(cè)含有過(guò)濾器甜滨、監(jiān)聽(tīng)器、Servlet瘤袖,
監(jiān)聽(tīng)器優(yōu)先級(jí)>過(guò)濾器優(yōu)先級(jí)>Servlet優(yōu)先級(jí)
監(jiān)聽(tīng)器的分類
按監(jiān)聽(tīng)的對(duì)象劃分
【a】用于監(jiān)聽(tīng)?wèi)?yīng)用程序環(huán)境對(duì)象(ServletContext)的事件監(jiān)聽(tīng)器。
【b】用于監(jiān)聽(tīng)用戶會(huì)話對(duì)象(HttpSession)的事件監(jiān)聽(tīng)器
【c】用于監(jiān)聽(tīng)請(qǐng)求消息對(duì)象(ServletRequest)的事件監(jiān)聽(tīng)器
按監(jiān)聽(tīng)的事件劃分
【a】監(jiān)聽(tīng)域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽(tīng)器
定義:監(jiān)聽(tīng)的對(duì)象包括ServletContext昂验、HttpSession捂敌、ServletRequest,Servlet規(guī)范中定義了三個(gè)接口ServletContextListener既琴、HttpSessionListener占婉、ServletRequestListener來(lái)監(jiān)聽(tīng)這三個(gè)對(duì)象的創(chuàng)建及銷毀事件。
【b】監(jiān)聽(tīng)域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽(tīng)器
【c】監(jiān)聽(tīng)綁定到HttpSession域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽(tīng)器
ServletContext事件監(jiān)聽(tīng)器
ServletContext的創(chuàng)建及銷毀:ServletContext實(shí)現(xiàn)了ServletContextListener接口來(lái)監(jiān)聽(tīng)該對(duì)象的創(chuàng)建及銷毀事件甫恩,一個(gè)Web應(yīng)用下可以創(chuàng)建多個(gè)ServletContextListener逆济,但是一個(gè)Web應(yīng)用中只有一ServletContext對(duì)象,ServletContextListener對(duì)象的contextInitialized方法和contextDestroyed方法(主要用于數(shù)據(jù)庫(kù)連接關(guān)閉時(shí)磺箕,可以釋放一些資源奖慌,以免過(guò)度的占用),方法里的參數(shù)ServletContextEvent可以獲取ServletContext以及獲取一些初始化參數(shù)松靡。
ServletContextListener主要用途:做一些定時(shí)器:可以加載一些全局屬性對(duì)象简僧,可以創(chuàng)建全局的數(shù)據(jù)庫(kù)連接,以及加載一些緩存信息雕欺。
getServletContext():通過(guò)參數(shù)ServletContextEvent獲取ServletContext對(duì)象岛马,并且可以往全局變量ServletContext中存入變量,通過(guò)setAttribute方法屠列,這樣就可以在其他地方進(jìn)行獲取啦逆。
getInitParameter():通過(guò)ServletContext對(duì)象獲取初始化參數(shù)(初始化參數(shù)在web.xml中進(jìn)行配置)。
servletcontextlistener可以用于初始化各種屬性笛洛,或者在結(jié)束時(shí)釋放相關(guān)資源
HttpSession的事件監(jiān)聽(tīng)器
監(jiān)聽(tīng)域?qū)ο螅℉ttpSession):HttpSession實(shí)現(xiàn)了HttpSessionListener接口夏志,用于監(jiān)聽(tīng)該對(duì)象的創(chuàng)建及銷毀事件,一個(gè)HttpSession對(duì)象可以注冊(cè)多個(gè)HttpSessionListener接口撞蜂,一個(gè)Web應(yīng)用中也可以有多個(gè)HttpSession對(duì)象盲镶,HttpSessionListener有sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se)侥袜,分別是session創(chuàng)建和銷毀時(shí)調(diào)用,方法里的參數(shù)可以獲取當(dāng)前創(chuàng)建的HttpSession對(duì)象溉贿。
HttpSessionListener主要用途
統(tǒng)計(jì)在線人數(shù)枫吧,記錄訪問(wèn)日志(在后臺(tái)把訪問(wèn)人的訪問(wèn)時(shí)間和ip做一些統(tǒng)計(jì)數(shù)據(jù))
HttpSession對(duì)象的創(chuàng)建和銷毀:
session對(duì)象的創(chuàng)建是在用戶第一次打開(kāi)瀏覽器,第一次訪問(wèn)Wen應(yīng)用時(shí)宇色,這次對(duì)話Web容器就會(huì)分配一個(gè)session九杂,用戶可以在session里保存一些信息,session對(duì)象的銷毀第一是關(guān)閉服務(wù)器宣蠕,會(huì)調(diào)用銷毀方法例隆,第二種是關(guān)閉瀏覽器session會(huì)被銷毀(session不一定會(huì)立即銷毀,該時(shí)間不是一個(gè)量化的)抢蚀,第三種镀层,不關(guān)閉瀏覽器,session超時(shí)(可以通過(guò)在web.xml中配置
ServletRequest的監(jiān)聽(tīng)器
ServletRequest對(duì)象的創(chuàng)建和銷毀:ServletRequest的創(chuàng)建和銷毀是實(shí)現(xiàn)了ServletRequestListener接口皿曲,一個(gè)ServletRequest對(duì)象可以注冊(cè)多個(gè)ServletRequestListener接口唱逢,并且實(shí)現(xiàn)了requestInitialized(ServletRequestEvent sre)request創(chuàng)建時(shí)被調(diào)用,requestDestroyed(ServletRequestEvent sre)request銷毀時(shí)調(diào)用屋休。
ServletRequestListener主要用途:讀取request里的參數(shù)坞古,記錄訪問(wèn)歷史、訪問(wèn)路徑劫樟,都可以通過(guò)它來(lái)進(jìn)行監(jiān)聽(tīng)(監(jiān)聽(tīng)到每一個(gè)用戶的訪問(wèn)請(qǐng)求痪枫,請(qǐng)求結(jié)束后就會(huì)執(zhí)行銷毀方法,有g(shù)etServletContext方法和getServletRequest方法)叠艳。
HttpSession中的對(duì)象狀態(tài)
(1)綁定:通過(guò)setAttribute();
(2)解除綁定:removeAttribute();
(3)鈍化:將session對(duì)象序列化到存儲(chǔ)設(shè)備上
(4)活化:將session對(duì)象從存儲(chǔ)設(shè)備上進(jìn)行恢復(fù)
session鈍化機(jī)制:
(1)把服務(wù)器中不常使用的session對(duì)象暫時(shí)的序列化到系統(tǒng)文件或是數(shù)據(jù)庫(kù)中奶陈,當(dāng)使用時(shí)反序列化到內(nèi)存中,整個(gè)過(guò)程有服務(wù)器自動(dòng)完成虑绵。
(2)session的鈍化機(jī)制由SessionManager管理
Servlet3.0下監(jiān)聽(tīng)器的使用
Servlet2.5下可以定義監(jiān)聽(tīng)器的順序尿瞭,通過(guò)在web.xml中定義,Servlet3.0通過(guò)注解@WebListener實(shí)現(xiàn)這一功能,就不需要在web.xml配置Listener翅睛。
注意:@WebListener方式不能實(shí)現(xiàn)設(shè)置順序功能