Java listener簡介_動力節(jié)點Java學院整理
1: 監(jiān)聽器的定義:
監(jiān)聽器實際上是一個類,這個類實現了特定的接口,然后將這個類在 web.xml 文件中進行描述,這樣服務器在啟動的時候就可以實例化這個類,啟動監(jiān)聽器。當范圍對象的狀態(tài)發(fā)生變化的時候,服務器自動調用監(jiān)聽器對象中的方法。例如統計用戶在線人數。


web監(jiān)聽器是Servlet規(guī)范中定義的一種特殊類,用于監(jiān)聽ServletContext,HttpSession,ServletRequest等域對象的創(chuàng)建、銷毀、以及屬性的變化等,可以在事件發(fā)生前、發(fā)生后進行一些處理。
2、監(jiān)聽器的用途
- 統計在線人數和在線用戶
- 系統加載時進行信息的初始化工作
- 統計網站的訪問量
- 跟Spring結合
3、實例
在web.xml文件中進行配置

listenr-class中是自己定義的Listener的類路徑
public class MyRequestListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
System.out.println("啟動監(jiān)聽器");
}
public void contextDestroy(ServletContextEvent event){
System.out.println("結束監(jiān)聽器");
}
}
編譯器會為我們自動生成contextInitialized和contextDestroy兩個函數
監(jiān)聽器>過濾器>serlvet,在 web.xml 文件中配置的時候注意順序
4 監(jiān)聽器的分類
按監(jiān)聽的對象劃分,可以分為監(jiān)聽
- ServletContext對象
- HttpSession對象
- ServletRequest對象
按監(jiān)聽的事件劃分
- 域對象自身的創(chuàng)建和銷毀
- 域對象中屬性的創(chuàng)建和消除
- 綁定到session中的某個對象的狀態(tài)
由于很多監(jiān)聽的方式一致,因此我們只考慮其中的HttpSession對象:
在web.xml中配置session超時
<session-config> <session-timeout> 30 </session-timeout> </session-config>
當超過30秒后,session會自動過期
public class MyRequestListener implements HttpSessionListener{
public void sessionCreate(HttpSessionEvent event){
System.out.println("event 創(chuàng)建:");
}
public void sessionDestroy(HttpSessionEvent event){
System.out.println("event 銷毀:");
}
}
另外,我們可以實現HttpSessionAttributeListener來實現session對象屬性的增加(added)、刪除(removed)、替換(replaced)的功能
public class MyRequestListener implements HttpSessionAttributeListener{
public void attributeAdded(HttpSessionBindEvent event){
}
public void attributeRemoved(HttpSessionBindEvent event){
}
public void attributeReplaced(HttpSessionBindEvent event){
}
}
5、Servlte3.0下的使用
在Servlet3.0下通過注解@WebListener("")就可以實現了,不需要在web.xml中進行配置
6、實戰(zhàn)(偽代碼)
public class MyRequestListener implements HttpSessionListener{
private int counts = 0;//用于統計在線人數
public void sessionCreate(HttpSessionEvent event){
counts++;
event.getSession().getServletContext.setAttribute("name",counts); //用戶人數+1
}
public void sessionDestroy(HttpSessionEvent event){
counts--;
event.getSession().getServletContext.setAttribute("name",counts);//用戶人數-1
}
}
@WebListener
public class MyRequestListener2 implements ServletRequestListener{
private ArrayList<User>list; //創(chuàng)建一個在線用戶的列表
public void requestCreate(ServletRequestEvent event){
HttpServletRequest request = (HttpServletRequest) request.getServletContext();
String sessionId = request.getSession().getSessionId();
if(sessionId ...){
....
list.add(...);
}
}
public void requestDestroy(ServletRequestEvent event){
}
}
public class User{
private int sessionId;
}
相關文章
Java ScheduledExecutorService的具體使用
ScheduledExecutorService有線程池的特性,也可以實現任務循環(huán)執(zhí)行,本文主要介紹了Java ScheduledExecutorService的具體使用,具有一定的參考價值,感興趣的可以了解一下2023-05-05

