Java三十六篇:初識(shí)Listener
Java三十六篇:初識(shí)Listener
1.什么是監(jiān)聽器?
Listener:監(jiān)聽器,是 Servlet 中一種比較特殊的類,能幫助開發(fā)者監(jiān)聽 web 中的特定事件,如 ServletContext、HttpSession、ServletRequest 的創(chuàng)建和銷毀;變量的創(chuàng)建、銷毀和修改等;也可以在某些動(dòng)作前后增加處理,實(shí)現(xiàn)監(jiān)控
監(jiān)聽器就是監(jiān)聽某個(gè)對象的的狀態(tài)變化的組件
監(jiān)聽器的相關(guān)概念:
事件源:被監(jiān)聽的對象 ?----- 三個(gè)域?qū)ο?request ?session ?servletContext
監(jiān)聽器:監(jiān)聽事件源對象 ?事件源對象的狀態(tài)的變化都會(huì)觸發(fā)監(jiān)聽器
注冊監(jiān)聽器:將監(jiān)聽器與事件源進(jìn)行綁定
響應(yīng)行為:監(jiān)聽器監(jiān)聽到事件源的狀態(tài)變化時(shí) 所涉及的功能代碼 ---- 程序員編寫代 碼
2.監(jiān)聽器有哪些?
第一維度:按照被監(jiān)聽的對象劃分:ServletRequest域 ?HttpSession域 ? ServletContext域
第二維度:監(jiān)聽的內(nèi)容分:監(jiān)聽域?qū)ο蟮膭?chuàng)建與銷毀的 ? 監(jiān)聽域?qū)ο蟮膶傩宰?化的

監(jiān)控器的分類:
監(jiān)聽生命周期:監(jiān)聽三大域?qū)ο蟮膭?chuàng)建和銷毀,當(dāng) tomcat 創(chuàng)建或銷毀這三大域?qū)ο髸r(shí),會(huì)執(zhí)行相應(yīng)的操作
ServletRequestListener:瀏覽器發(fā)起請求時(shí)創(chuàng)建 ServletRequest
HttpSessionListener:調(diào)用 request.getSession() 時(shí)服務(wù)器不存在當(dāng)前請求的 JSESSIONID 創(chuàng)建 HttpSession
ServletContextListener:項(xiàng)目啟動(dòng)時(shí)創(chuàng)建 ServletContext
監(jiān)聽屬性值的變化:監(jiān)聽三大域?qū)ο骻et/setAttribute(),當(dāng)給域?qū)ο笤O(shè)置或取值時(shí)會(huì)被監(jiān)聽到,并作相應(yīng)的處理
ServletRequestAttributeListener
HttpSessionAttributeListener
ServletContextAttributeListener
針對 session 的對象:
HttpSessionBindingListener、HttpSessionActivationListener:監(jiān)聽 session 中的 java 對象(javaBean),是 javaBean 直接實(shí)現(xiàn)監(jiān)聽器的接口
3.監(jiān)聽三大域?qū)ο蟮膭?chuàng)建與銷毀的監(jiān)聽器
(1)監(jiān)聽ServletContext域的創(chuàng)建與銷毀的監(jiān)聽器ServletContextListener
1)Servlet域的生命周期
何時(shí)創(chuàng)建:服務(wù)器啟動(dòng)創(chuàng)建
何時(shí)銷毀:服務(wù)器關(guān)閉銷毀
2)監(jiān)聽器的編寫步驟(重點(diǎn)):
a、編寫一個(gè)監(jiān)聽器類去實(shí)現(xiàn)監(jiān)聽器接口
b、覆蓋監(jiān)聽器的方法
c、需要在web.xml中進(jìn)行配置---注冊
3)監(jiān)聽的方法:

4)配置文件:

5)ServletContextListener監(jiān)聽器的主要作用
a、初始化的工作:初始化對象 初始化數(shù)據(jù) ---- 加載數(shù)據(jù)庫驅(qū)動(dòng) ?連接池的初始 化
b、加載一些初始化的配置文件 --- spring的配置文件

c、任務(wù)調(diào)度----定時(shí)器----Timer/TimerTask

(2)監(jiān)聽Httpsession域的創(chuàng)建于銷毀的監(jiān)聽器HttpSessionListener
1)HttpSession對象的生命周期
何時(shí)創(chuàng)建:第一次調(diào)用request.getSession時(shí)創(chuàng)建
何時(shí)銷毀:服務(wù)器關(guān)閉銷毀 ?session過期 ?手動(dòng)銷毀
2)HttpSessionListener的方法

(3)監(jiān)聽ServletRequest域創(chuàng)建與銷毀的監(jiān)聽器ServletRequestListener
1)ServletRequest的生命周期
創(chuàng)建:每一次請求都會(huì)創(chuàng)建request
銷毀:請求結(jié)束
2)ServletRequestListener的方法

4.監(jiān)聽三大域?qū)ο蟮膶傩宰兓?/h1>(1)域?qū)ο蟮耐ㄓ玫姆椒ǎ?/h1>
setAttribute(name,value)
--- 觸發(fā)添加屬性的監(jiān)聽器的方法
--- 觸發(fā)修改屬性的監(jiān)聽器的方法
getAttribute(name)
removeAttribute(name)
--- 觸發(fā)刪除屬性的監(jiān)聽器的方法
(2)ServletContextAttibuteListener監(jiān)聽

(3) HttpSessionAttributeListener監(jiān)聽器(同上)
(4) ServletRequestAriibuteListenr監(jiān)聽器(同上)
2.與session中的綁定的對象相關(guān)的監(jiān)聽器(對象感知監(jiān)聽器)
(1)即將要被綁定到session中的對象有幾種狀態(tài)
綁定狀態(tài):就一個(gè)對象被放到session域中
解綁狀態(tài):就是這個(gè)對象從session域中移除了
鈍化狀態(tài):是將session內(nèi)存中的對象持久化(序列化)到磁盤
活化狀態(tài):就是將磁盤上的對象再次恢復(fù)到session內(nèi)存中
面試題:當(dāng)用戶很對時(shí),怎樣對服務(wù)器進(jìn)行優(yōu)化?
(2)綁定與解綁的監(jiān)聽器HttpSessionBindingListene

(3)鈍化與活化的監(jiān)聽器HttpSessionActivationListener
可以通過配置文件 指定對象鈍化時(shí)間 --- 對象多長時(shí)間不用被鈍化
在META-INF下創(chuàng)建一個(gè)context.xml

被鈍化到work/catalina/localhost/的文件

實(shí)驗(yàn):對在線人數(shù)作實(shí)時(shí)監(jiān)控
實(shí)現(xiàn)步驟:
創(chuàng)建一個(gè) HttpSession 監(jiān)聽器,在 session 進(jìn)行創(chuàng)建時(shí)對在線人數(shù)進(jìn)行加一,在 session 被銷毀時(shí)對在線人數(shù)進(jìn)行減一,并將在線人數(shù)存進(jìn) ServletContext 域
通過 @WebListener 注解配置該監(jiān)聽器
