監(jiān)聽器

1、過濾器的基本概念

現(xiàn)實(shí)中的監(jiān)聽器
定義:
是指專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生變化時(shí),立即采取相應(yīng)的行動(dòng)。

web監(jiān)聽器

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

步驟:

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

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

4、對(duì)application監(jiān)聽(ServletContext)
application

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

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

在上下文監(jiān)聽操作中,一旦觸發(fā)了ServletContextListener接口中定義的事件后,可 以通過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("銷毀--" +  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)聽: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)聽操作中,一旦觸發(fā)了ServletContextAttributeListener接口中定義的事件后,可 以通過ServletContextAttributeEvent進(jìn)行事件的處理,該事件中定義的方法:

public String getName()    //取得設(shè)置的屬性名稱
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("增加屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

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

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

}

web.xml配置

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

主要使用HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener接口

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

當(dāng)session創(chuàng)建或銷毀后,將產(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("銷毀session--" + event.getSession().getId());
   }

}

web.xml

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

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

  • 方式一:調(diào)用HttpSession接口的invalidate()方法,讓一個(gè)session失效。
  • 方式二:超過了配置是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分鐘后沒有與服務(wù)器進(jìn)行任何交互操作的話,那么服務(wù)器會(huì)認(rèn)為此用戶已經(jīng)離開,會(huì)自動(dòng)將其注銷。
如果沒有在項(xiàng)目中設(shè)置超時(shí)時(shí)間,則默認(rèn)的超時(shí)時(shí)間為30分鐘。

  1. session屬性監(jiān)聽: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()    //取得屬性名稱
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() + "增加屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
   }

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

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

}

web.xml

    <listener>
        <listener-class>com.meng.listener.HttpSessionAttributeListenerDemo</listener-class>
    </listener>
  1. session屬性監(jiān)聽:HttpSessionBindingListener接口
    實(shí)現(xiàn)javax.servlet.http.HttpSessionBindingListener接口的監(jiān)聽程序可以不用再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)聽接口的作用類似,只是一個(gè)需要配置,一個(gè)不需要配置。

6、對(duì)request監(jiān)聽(ServletRequest)
request

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

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

ServletRequestListener接口一旦監(jiān)聽到事件后,將產(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)聽: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()    //取得屬性名稱
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)聽器的使用
使用servlet3.0的前提條件
8、實(shí)例(統(tǒng)計(jì)在線用戶及人數(shù))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容