17.7Listener監(jiān)聽器

一、監(jiān)聽器介紹

1.1、監(jiān)聽器的概念

監(jiān)聽器

監(jiān)聽器是一個專門用于對其他對象身上發(fā)生的事件或狀態(tài)改變進行監(jiān)聽和相應(yīng)處理的對象,當被監(jiān)視的對象發(fā)生情況時,立即采取相應(yīng)的行動。監(jiān)聽器其 實就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖儯敱槐O(jiān)聽對象發(fā)生上述事件后,監(jiān)聽器某個方法 立即被執(zhí)行。

二、JavaWeb中的監(jiān)聽器

2.1、基本概念

JavaWeb中的監(jiān)聽器是Servlet規(guī)范中定義的一種特殊類,它用于監(jiān)聽web應(yīng)用程序中的ServletContext, HttpSession和 ServletRequest等域?qū)ο蟮膭?chuàng)建與銷毀事件,以及監(jiān)聽這些域?qū)ο笾械膶傩园l(fā)生修改的事件。

2.2、Servlet監(jiān)聽器的分類

在Servlet規(guī)范中定義了多種類型的監(jiān)聽器,它們用于監(jiān)聽的事件源分別為ServletContext,HttpSession和ServletRequest這三個域?qū)ο?/p>

Servlet規(guī)范針對這三個對象上的操作,又把多種類型的監(jiān)聽器劃分為三種類型:

  • 1、監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽器。
  • 2、監(jiān)聽域?qū)ο笾械膶傩缘脑黾雍蛣h除的事件監(jiān)聽器。
  • 3、監(jiān)聽綁定到HttpSession域中的某個對象的狀態(tài)的事件監(jiān)聽器。

2.3、監(jiān)聽ServletContext域?qū)ο蟮膭?chuàng)建和銷毀

ServletContextListener接口用于監(jiān)聽ServletContext對象的創(chuàng)建和銷毀事件。實現(xiàn)了ServletContextListener接口的類都可以對ServletContext對象的創(chuàng)建和銷毀進行監(jiān)聽。
當ServletContext對象被創(chuàng)建時,激發(fā)contextInitialized (ServletContextEvent sce)方法。
當ServletContext對象被銷毀時,激發(fā)contextDestroyed(ServletContextEvent sce)方法。

ServletContext域?qū)ο髣?chuàng)建和銷毀時機:

  • 1、創(chuàng)建:服務(wù)器啟動針對每一個Web應(yīng)用創(chuàng)建ServletContext
  • 2、銷毀:服務(wù)器關(guān)閉前先關(guān)閉代表每一個web應(yīng)用的ServletContext

下面介紹一個監(jiān)聽用戶在線的監(jiān)聽器

OnLineCountListener.java

public class OnLineCountListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onLineCount = (Integer) context.getAttribute("onLineCount");
        if (onLineCount == null) {
            context.setAttribute("onLineCount", 1);
        } else {
            onLineCount++;
            context.setAttribute("onLineCount", onLineCount);
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext context = se.getSession().getServletContext();
        Integer onLineCount = (Integer) context.getAttribute("onLineCount");
        if (onLineCount == null) {
            context.setAttribute("onLineCount", 1);
        } else {
            onLineCount--;
            context.setAttribute("onLineCount", onLineCount);
        }
    }
}

監(jiān)聽sessionCreatedsessionDestroyed兩個事件。

配置web.xml

 <listener>
        <listener-class>com.critc.listener.OnLineCountListener</listener-class>
    </listener>

加入監(jiān)聽器的配置

index.jsp

當前在線人數(shù):<%=session.getServletContext().getAttribute("onLineCount")%>

啟動tomcat,通過session.getServletContext().getAttribute("onLineCount")可以獲取在線人數(shù)。如下圖所示,可以通過打開多個瀏覽器來模擬多個人。

在線人數(shù)

監(jiān)聽器用的非常非常多,還可以用于監(jiān)聽定時任務(wù)的執(zhí)行、消息隊列的處理等等。這里只是簡單介紹一個例子

源碼下載

本例子詳細源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 本文包括:1、Listener簡介2、Servlet監(jiān)聽器3、監(jiān)聽三個域?qū)ο髣?chuàng)建和銷毀的事件監(jiān)聽器4、監(jiān)聽三個域?qū)?..
    廖少少閱讀 6,674評論 6 28
  • 監(jiān)聽器(listener) 監(jiān)聽器簡介 :監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個...
    奮斗的老王閱讀 2,688評論 0 53
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,857評論 11 349
  • 僅作為自己學(xué)習(xí)記錄使用,文章來自: 1、http://blog.csdn.net/csh624366188/art...
    BakerZhang閱讀 1,145評論 1 5
  • 一、概述 監(jiān)聽器就是一個實現(xiàn)特定接口的普通java程序,這個程序?qū)iT用于監(jiān)聽另一個java對象的方法調(diào)用或?qū)傩愿淖?..
    yjaal閱讀 2,115評論 0 5

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