監(jiān)聽(tīng)器

1漓柑、過(guò)濾器的基本概念

現(xiàn)實(shí)中的監(jiān)聽(tīng)器
定義:
是指專(zhuān)門(mén)用于對(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)。

web監(jiān)聽(tīng)器

  • 是Servlet規(guī)范中定義的一種特殊類(lèi)排吴。
  • 主要功能是負(fù)責(zé)監(jiān)聽(tīng)Web的各種操作(客戶端的請(qǐng)求、服務(wù)端的操作)懦鼠,當(dāng)相關(guān)的事件觸發(fā)后將產(chǎn)生事件,并對(duì)事件進(jìn)行處理屹堰。
  • 用于監(jiān)聽(tīng)的對(duì)象:ServletContext(application)肛冶、HttpSession(session)和ServletRequest(request)3個(gè)域?qū)ο蟆?/li>
  • 用于監(jiān)聽(tīng)域?qū)ο蟮膭?chuàng)建、銷(xiāo)毀扯键、屬性變化睦袖。
  • 可以在事件發(fā)生前、發(fā)生后做一些必要的處理荣刑。
2馅笙、Web監(jiān)聽(tīng)器的用途
  • 統(tǒng)計(jì)在線人數(shù)和在線用戶
  • 系統(tǒng)啟動(dòng)時(shí)加載初始化信息
  • 統(tǒng)計(jì)網(wǎng)站訪問(wèn)量
  • 跟Spring結(jié)合
3伦乔、創(chuàng)建web監(jiān)聽(tīng)器

步驟:

  1. 創(chuàng)建一個(gè)實(shí)現(xiàn)監(jiān)聽(tīng)器接口的類(lèi)
  2. 配置web.xml進(jìn)行注冊(cè)
監(jiān)聽(tīng)器的啟動(dòng)順序
3、監(jiān)聽(tīng)器的分類(lèi)
  1. 按監(jiān)聽(tīng)的對(duì)象劃分
  • 用于監(jiān)聽(tīng)?wèi)?yīng)用程序環(huán)境對(duì)象的事件監(jiān)聽(tīng)器 (ServletContext)
  • 用于監(jiān)聽(tīng)用戶會(huì)話對(duì)象的事件監(jiān)聽(tīng)器 (HttpSession)
  • 用于監(jiān)聽(tīng)請(qǐng)求消息對(duì)象的事件監(jiān)聽(tīng)器 (ServletRequest)
  1. 按監(jiān)聽(tīng)的事件劃分
  • 監(jiān)聽(tīng)域?qū)ο笞陨淼膭?chuàng)建和銷(xiāo)毀的事件監(jiān)聽(tīng)器
  • 監(jiān)聽(tīng)對(duì)象中屬性的增加和刪除的事件監(jiān)聽(tīng)器
  • 監(jiān)聽(tīng)綁定到HttpSession域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽(tīng)器

session頓化機(jī)制(在開(kāi)發(fā)中用的并不是很多)

4董习、對(duì)application監(jiān)聽(tīng)(ServletContext)
application

主要使用ServletContextListener和ServletContextAttributeListener兩個(gè)接口

  1. 上下文狀態(tài)監(jiān)聽(tīng):ServletContextListener接口
    實(shí)現(xiàn)javax.servlet.ServletContextListener
public void contextInitialized(ServletContextEvent event)    //容器啟動(dòng)時(shí)觸發(fā)
public void contextDestroyed(ServletContextEvent event)    //容器銷(xiāo)毀時(shí)觸發(fā)

在上下文監(jiān)聽(tīng)操作中烈和,一旦觸發(fā)了ServletContextListener接口中定義的事件后,可 以通過(guò)ServletContextEvent進(jìn)行事件的處理皿淋,該事件中定義的方法:

public ServletContext getServletContext()      //取得ServletContext對(duì)象
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServletContextListenerDemo implements ServletContextListener {

   @Override
   public void contextDestroyed(ServletContextEvent event) {
       System.out.println("銷(xiāo)毀--" +  event.getServletContext().getContextPath());
   }

   @Override
   public void contextInitialized(ServletContextEvent event) {
       System.out.println("初始化--" +  event.getServletContext().getContextPath());
   }   
}

web.xml配置

    <listener>
        <listener-class>com.meng.listener.ServletContextListenerDemo</listener-class>
    </listener>
  1. 上下文屬相監(jiān)聽(tīng):ServletContextAttributeListener接口
    實(shí)現(xiàn)javax.servlet.ServletContextAttributeListener
public void attributeAdded(ServletContextAttributeEvent event)    //增加屬性時(shí)觸發(fā)
public void attributeRemoved(ServletContextAttributeEvent event)    //刪除屬性時(shí)觸發(fā)
public void attributeReplaced(ServletContextAttributeEvent event)    //替換屬性時(shí)觸發(fā)

在上下文監(jiān)聽(tīng)操作中招刹,一旦觸發(fā)了ServletContextAttributeListener接口中定義的事件后,可 以通過(guò)ServletContextAttributeEvent進(jìn)行事件的處理窝趣,該事件中定義的方法:

public String getName()    //取得設(shè)置的屬性名稱(chēng)
public Object getValue()    //取得設(shè)置的屬性內(nèi)容
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

public class ServletContextAttributeListenerDemo implements  ServletContextAttributeListener {

   @Override
   public void attributeAdded(ServletContextAttributeEvent event) {
       System.out.println("增加屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

   @Override
   public void attributeRemoved(ServletContextAttributeEvent event) {
       System.out.println("刪除屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

   @Override
   public void attributeReplaced(ServletContextAttributeEvent event) {
       System.out.println("替換屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

}

web.xml配置

    <listener>
        <listener-class>com.meng.listener.ServletContextAttributeListenerDemo</listener-class>
    </listener>
5疯暑、對(duì)session監(jiān)聽(tīng)(HttpSession)
session

主要使用HttpSessionListener、HttpSessionAttributeListener哑舒、HttpSessionBindingListener接口

  1. session狀態(tài)監(jiān)聽(tīng):HttpSessionListener接口
    實(shí)現(xiàn)javax.servlet.http.HttpSessionListener監(jiān)聽(tīng)session的創(chuàng)建或銷(xiāo)毀妇拯。
public void sessionCreated(HttpSessionEvent event)     //session創(chuàng)建時(shí)調(diào)用
public void sessionDestroyed(HttpSessionEvent event)    //session銷(xiāo)毀時(shí)調(diào)用

當(dāng)session創(chuàng)建或銷(xiāo)毀后,將產(chǎn)生HttpSessionEvent事件:

public HttpSession getSession()    //取得當(dāng)前的session
 package com.meng.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class HttpSessionListenerDemo implements HttpSessionListener {

   @Override
   public void sessionCreated(HttpSessionEvent event) {
       System.out.println("創(chuàng)建session--" + event.getSession().getId());
   }

   @Override
   public void sessionDestroyed(HttpSessionEvent event) {
       System.out.println("銷(xiāo)毀session--" + event.getSession().getId());
   }

}

web.xml

    <listener>
        <listener-class>com.meng.listener.HttpSessionListenerDemo</listener-class>
    </listener>

session什么時(shí)候銷(xiāo)毀的洗鸵?
(1)關(guān)閉服務(wù)器
(2)關(guān)閉瀏覽器一段時(shí)間越锈,直到session過(guò)期
(3)不關(guān)閉瀏覽器,session超時(shí)
session銷(xiāo)毀的操作
當(dāng)一個(gè)新用戶打開(kāi)一個(gè)動(dòng)態(tài)也時(shí)预麸,服務(wù)器會(huì)為新用戶分配session瞪浸,并且觸發(fā)HttpSessionListener接口中的sessionCreated()事件,但是在用戶銷(xiāo)毀時(shí)卻有兩種不同的 方式來(lái)觸發(fā)sessionDestroyed()事件吏祸。

  • 方式一:調(diào)用HttpSession接口的invalidate()方法对蒲,讓一個(gè)session失效。
  • 方式二:超過(guò)了配置是session超時(shí)時(shí)間贡翘,session超時(shí)時(shí)間可以直接在項(xiàng)目的web.xml中配置蹈矮。
<session-config>
   <session-timeout>5</session-timeout>
</session-config>

以上將一個(gè)session的超時(shí)時(shí)間設(shè)置成了5分鐘,如果一個(gè)用戶在5分鐘后沒(méi)有與服務(wù)器進(jìn)行任何交互操作的話鸣驱,那么服務(wù)器會(huì)認(rèn)為此用戶已經(jīng)離開(kāi)泛鸟,會(huì)自動(dòng)將其注銷(xiāo)。
如果沒(méi)有在項(xiàng)目中設(shè)置超時(shí)時(shí)間踊东,則默認(rèn)的超時(shí)時(shí)間為30分鐘北滥。

  1. session屬性監(jiān)聽(tīng):HttpSessionAttributeListener接口
    實(shí)現(xiàn)javax.servlet.http.HttpSessionAttributeListener
public void attributeAdded(HttpSessionBindingEvent event)    //增加屬性時(shí)觸發(fā)
public void attributeRemoved(HttpSessionBindingEvent event)    //刪除屬性時(shí)觸發(fā)
public void attributeReplaced(HttpSessionBindingEvent event)    //替換屬性時(shí)觸發(fā)

HttpSessionBindingEvent事件的方法

public HttpSession getSession()    //取得session
public String getName()    //取得屬性名稱(chēng)
public Object getValue()    //取得屬性內(nèi)容
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {

   @Override
   public void attributeAdded(HttpSessionBindingEvent event) {
       System.out.println(event.getSession().getId() + "增加屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

   @Override
   public void attributeRemoved(HttpSessionBindingEvent event) {
       System.out.println(event.getSession().getId() + "刪除屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

   @Override
   public void attributeReplaced(HttpSessionBindingEvent event) {
       System.out.println(event.getSession().getId() + "替換屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

}

web.xml

    <listener>
        <listener-class>com.meng.listener.HttpSessionAttributeListenerDemo</listener-class>
    </listener>
  1. session屬性監(jiān)聽(tīng):HttpSessionBindingListener接口
    實(shí)現(xiàn)javax.servlet.http.HttpSessionBindingListener接口的監(jiān)聽(tīng)程序可以不用再web.xml中配置而直接使用。
public void valueBound(HttpSessionBindingEvent event)    //綁定對(duì)象到session時(shí)觸發(fā)
public void valueUnbound(HttpSessionBindingEvent event)    //從session中移除對(duì)象時(shí)觸發(fā)
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class HttpSessionBindingListenerDemo implements HttpSessionBindingListener {

   @Override
   public void valueBound(HttpSessionBindingEvent event) {

   }

   @Override
   public void valueUnbound(HttpSessionBindingEvent event) {

   }

}

HttpSessionAttributeListener和HttpSessionBindingListener兩個(gè)監(jiān)聽(tīng)接口的作用類(lèi)似闸翅,只是一個(gè)需要配置再芋,一個(gè)不需要配置。

6坚冀、對(duì)request監(jiān)聽(tīng)(ServletRequest)
request

在servlet2.4之后增加了對(duì)request操作的監(jiān)聽(tīng)济赎,主要使用ServletRequestListener、ServletRequestAttributeListener兩個(gè)接口。

  1. 請(qǐng)求狀態(tài)監(jiān)聽(tīng):ServletRequestListener接口
    當(dāng)需要對(duì)用戶的每次請(qǐng)求進(jìn)行監(jiān)聽(tīng)時(shí)司训,可以實(shí)現(xiàn)javax.servlet.ServletRequestListener接口
public void requestInitialized(ServletRequestEvent event)    //請(qǐng)求開(kāi)始時(shí)調(diào)用
public void requestDestroyed(ServletRequestEvent event)    //請(qǐng)求結(jié)束時(shí)調(diào)用

ServletRequestListener接口一旦監(jiān)聽(tīng)到事件后构捡,將產(chǎn)生ServletRequestEvent的事件處理對(duì)象。

public ServletRequest getServletRequest()    //取得ServletRequest對(duì)象
public ServletContext getServletContext()    //取得ServletContext對(duì)象
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class ServletRequestListenerDemo implements ServletRequestListener {

   @Override
   public void requestDestroyed(ServletRequestEvent event) {

   }

   @Override
   public void requestInitialized(ServletRequestEvent event) {

   }

}

web.xml

    <listener>
        <listener-class>com.meng.listener.ServletRequestListenerDemo</listener-class>
    </listener>
  1. request屬性監(jiān)聽(tīng):ServletRequestAttributeListener接口
    實(shí)現(xiàn)javax.servlet.ServletRequestAttributeListener接口
public void attributeAdded(ServletRequestAttributeEvent event)
public void attributeRemoved(ServletRequestAttributeEvent event)
public void attributeReplaced(ServletRequestAttributeEvent event)
public String getName()    //取得屬性名稱(chēng)
public Object getValue()    //取得屬性內(nèi)容
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {

   @Override
   public void attributeAdded(ServletRequestAttributeEvent event) {

   }

   @Override
   public void attributeRemoved(ServletRequestAttributeEvent event) {

   }

   @Override
   public void attributeReplaced(ServletRequestAttributeEvent event) {

   }

}

web.xml

    <listener>
        <listener-class>com.meng.listener.ServletRequestAttributeListenerDemo</listener-class>
    </listener>
7壳猜、servlet3.0下監(jiān)聽(tīng)器的使用
使用servlet3.0的前提條件
8勾徽、實(shí)例(統(tǒng)計(jì)在線用戶及人數(shù))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蓖谢,隨后出現(xiàn)的幾起案子捂蕴,更是在濱河造成了極大的恐慌,老刑警劉巖闪幽,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啥辨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盯腌,警方通過(guò)查閱死者的電腦和手機(jī)溉知,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)腕够,“玉大人级乍,你說(shuō)我怎么就攤上這事≈阆妫” “怎么了玫荣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)大诸。 經(jīng)常有香客問(wèn)我捅厂,道長(zhǎng),這世上最難降的妖魔是什么资柔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任焙贷,我火速辦了婚禮,結(jié)果婚禮上贿堰,老公的妹妹穿的比我還像新娘辙芍。我一直安慰自己,他們只是感情好羹与,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布故硅。 她就那樣靜靜地躺著,像睡著了一般纵搁。 火紅的嫁衣襯著肌膚如雪吃衅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,208評(píng)論 1 299
  • 那天诡渴,我揣著相機(jī)與錄音,去河邊找鬼。 笑死妄辩,一個(gè)胖子當(dāng)著我的面吹牛惑灵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眼耀,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼英支,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了哮伟?” 一聲冷哼從身側(cè)響起干花,我...
    開(kāi)封第一講書(shū)人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楞黄,沒(méi)想到半個(gè)月后池凄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鬼廓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年肿仑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碎税。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尤慰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雷蹂,到底是詐尸還是另有隱情伟端,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布匪煌,位于F島的核電站责蝠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虐杯。R本人自食惡果不足惜玛歌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擎椰。 院中可真熱鬧支子,春花似錦、人聲如沸达舒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巩搏。三九已至昨登,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贯底,已是汗流浹背丰辣。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工撒强, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笙什。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓飘哨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親琐凭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芽隆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 監(jiān)聽(tīng)器(listener) 監(jiān)聽(tīng)器簡(jiǎn)介 :監(jiān)聽(tīng)器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT(mén)用于監(jiān)聽(tīng)另一個(gè)...
    奮斗的老王閱讀 2,507評(píng)論 0 53
  • 本文包括:1统屈、Listener簡(jiǎn)介2胚吁、Servlet監(jiān)聽(tīng)器3、監(jiān)聽(tīng)三個(gè)域?qū)ο髣?chuàng)建和銷(xiāo)毀的事件監(jiān)聽(tīng)器4愁憔、監(jiān)聽(tīng)三個(gè)域?qū)?..
    廖少少閱讀 6,067評(píng)論 6 28
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理腕扶,服務(wù)發(fā)現(xiàn),斷路器惩淳,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 僅作為自己學(xué)習(xí)記錄使用蕉毯,文章來(lái)自: 1、http://blog.csdn.net/csh624366188/art...
    BakerZhang閱讀 1,013評(píng)論 1 5
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法思犁,類(lèi)相關(guān)的語(yǔ)法代虾,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法激蹲,異常的語(yǔ)法棉磨,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,624評(píng)論 18 399