一、監(jiān)聽器介紹
1.1、監(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)聽sessionCreated和sessionDestroyed兩個事件。
配置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ù)。如下圖所示,可以通過打開多個瀏覽器來模擬多個人。

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