Web監(jiān)聽器有Servlet規(guī)范提供捞烟,可監(jiān)聽客戶端請求與服務(wù)端操作。
application:上下文對象当船,由容器創(chuàng)建和初始化题画,它的范圍為整個Web應(yīng)用,而且整個Web應(yīng)用只會有一個application存在生年,當(dāng)Web服務(wù)器關(guān)閉時婴程,就會把application銷毀。
session:保持上下文的機制抱婉,針對每個會話,放在服務(wù)器端通過sessionId區(qū)分桌粉,在瀏覽器和服務(wù)器結(jié)束后都會銷毀session蒸绩。
request:當(dāng)客戶發(fā)送請求時,容器就會創(chuàng)建一個ServletRequest對象來封裝請求數(shù)據(jù)铃肯,同時ServletResponse對象來封裝響應(yīng)數(shù)據(jù)患亿。
Web監(jiān)聽器
Servlet規(guī)范中定義的一種特殊類
用于監(jiān)聽ServletContext、HttpSession和ServletRequest等域?qū)ο蟮膭?chuàng)建與銷毀事件押逼。
Web監(jiān)聽器的用途
統(tǒng)計在線人數(shù)和在線用戶
系統(tǒng)啟動時加載初始化信息
統(tǒng)計網(wǎng)站訪問量- 跟Spring結(jié)合
創(chuàng)建監(jiān)聽器
創(chuàng)建一個實現(xiàn)監(jiān)聽器接口的類
配置web.xml進(jìn)行注冊
監(jiān)聽器的啟動順序步藕,取決于我們在web.xml的注冊順序
優(yōu)先級:
A(監(jiān)聽器) --> B(過濾器) --> C(Servlet)
按監(jiān)聽器對象劃分
1、用于監(jiān)聽?wèi)?yīng)用程序環(huán)境對象(ServletContext)的事件監(jiān)聽器
2挑格、用于監(jiān)聽用戶會話對象(HttpSession)的事件監(jiān)聽器
3咙冗、用于監(jiān)聽請求消息對象(ServletRequest)的事件監(jiān)聽器
按監(jiān)聽的事件劃分
1、監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽器
-
ServletContext - ServletContextListener
一個項目可以有多個ServletContextListener漂彤,只能有一個ServletContext雾消;
-
兩個事件處理方法
public void contextInitialized(ServletContextEvent sce) - ServletContext 創(chuàng)建時調(diào)用
public void contextDestroyed(ServletContextEvent sce) - ServletContext 銷毀時調(diào)用
用途:可以用作定時器;用作全局屬性對象挫望。
web.xml配置
<context-param>
<param-name>initParam</param-name>
<param-value>imooc</param-value>
</context-param>
在contextInitialized方法體內(nèi)通過 sce.getServletContext().getInitParameter("initParam")獲取
-
HttpSession - HttpSessionListener
一個HttpSession可以注冊多個HttpSessionListener
一個web應(yīng)用程序中可以有多個HttpSession對象
-
兩個事件處理方法
public void sessionCreated(HttpSessionEvent se) - session創(chuàng)建時調(diào)用
public void sessionDestroyed(HttpSessionEvent se) - session銷毀時調(diào)用
兩個用途:統(tǒng)計在線人數(shù)立润;記錄訪問日志
銷毀:1、關(guān)閉服務(wù)器媳板;2桑腮、關(guān)閉瀏覽器一段時間直到session過期;3蛉幸、不關(guān)閉瀏覽器破讨,session超時
-
ServletRequest - ServletRequestListener
一個ServletRequest可以注冊多個ServletRequestListener
-
兩個事件處理方法
public void requestInitialized(ServletRequestEvent src) - request創(chuàng)建時調(diào)用
public void requestDestroyed(ServletRequestEvent src) - request銷毀時調(diào)用
2丛晦、監(jiān)聽域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽器
3、監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的事件監(jiān)聽器
按監(jiān)聽的事件劃分
監(jiān)聽域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽器
ServletContext - ServletContextAttributeListener
HttpSession - HttpSessionAttributeListener
ServletRequest - ServletRequestAttributeListener
都定義了:attributeAdded添忘,attributeRemoved采呐,attributeReplaced
監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的事件監(jiān)聽器
HttpSession中的對象狀態(tài)
綁定 ---> 解除綁定 鈍化 ---> 活化
session鈍化機制:session正常是放到服務(wù)器內(nèi)存當(dāng)中,服務(wù)器會對每個在線用戶創(chuàng)建一個session對象搁骑。當(dāng)在線用戶很多時斧吐,session內(nèi)存的開銷將是巨大的,會直接影響web服務(wù)器的性能仲器,session鈍化機制就可以解決這個問題煤率。session鈍化機制的本質(zhì)就是把服務(wù)器不經(jīng)常使用的session對象暫時序列化到系統(tǒng)文件或者數(shù)據(jù)庫系統(tǒng)當(dāng)中,整個過程由服務(wù)器自動創(chuàng)建乏冀。
Tomcat中兩種Session鈍化管理器
- Session鈍化機制由SessionManager管理
org.apache.catalina.session.StandardManger
- 當(dāng)Tomcat服務(wù)器被關(guān)閉或重啟時蝶糯,tomcat服務(wù)器會將當(dāng)前內(nèi)存中的Session對象鈍化到服務(wù)器文件系統(tǒng)中;
- 另一種情況是Web應(yīng)用服務(wù)器被重新加載時辆沦,內(nèi)存中的Session對象也會鈍化到服務(wù)器中的文件系統(tǒng)中昼捍;
- 鈍化后的文件被保存:Tomcat安裝路徑/work/Catalina/hostname/applicationname/SESSION.ser
Servlet規(guī)范
-
HttpSessionBindingListener
- 綁定:valueBound方法
- 解除綁定:valueUnbound方法
-
HttpSessionActivationListener
- 綁定:sessionWillPassivate方法
- 活化:sessionDidActivate方法
鈍化與活化必須實現(xiàn)Serializable
org.apache.catalina.session.Persistentmanager
- 首先在鈍化的基礎(chǔ)上進(jìn)行了擴展。第一種情況如上面1肢扯,第二種情況如上面2妒茬,第三種情況,可以配置主流內(nèi)存的Session對象數(shù)目蔚晨,將不常使用的Session對象保存到文件系統(tǒng)或數(shù)據(jù)庫乍钻,當(dāng)用時重新加載。
- 默認(rèn)情況下铭腕,Tomcat提供兩個鈍化驅(qū)動類
- org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore
servlet3.0下監(jiān)聽器的用法
@WebListener:該注解用于將類聲明為監(jiān)聽器银择,被@WebListener標(biāo)注的類必須實現(xiàn)以下至少一個接口:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- HttpSessionListener
- HttpSessionAttributeListener
@WebListener的常用屬性
<listener>
<listener-class>footmark.servlet.SimpleListener</listener-class>
</listener>
@WebListener("This is only a demo listener")
public class SimpleListener implements ServletContextListener{......}