1. 程式人生 > >Java 監聽器

Java 監聽器

1: 監聽器的定義

2:監聽器的用途

3:例項

4:監聽器分類

5:Servlet3.0下監聽器的使用

6:實際專案常用的案例

1: 監聽器的定義:

監聽器實際上是一個類,這個類實現了特定的介面,然後將這個類在 web.xml 檔案中進行描述,這樣伺服器在啟動的時候就可以例項化這個類,啟動監聽器。當範圍物件的狀態發生變化的時候,伺服器自動呼叫監聽器物件中的方法。例如統計使用者線上人數。

web監聽器是Servlet規範中定義的一種特殊類,用於監聽ServletContext,HttpSession,ServletRequest等域物件的建立、銷燬、以及屬性的變化等,可以在事件發生前、發生後進行一些處理。

2、監聽器的用途

  • 1、統計線上人數和線上使用者
  • 2、系統載入時進行資訊的初始化工作
  • 3、統計網站的訪問量
  • 4、跟Spring結合

3、例項

在web.xml檔案中進行配置

listenr-class中是自己定義的Listener的類路徑

1 2 3 4 5 6 7 8 9 public class MyRequestListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent event){ System.out.println("啟動監聽器"); }
public void contextDestroy(ServletContextEvent event){ System.out.println("結束監聽器"); } }

編譯器會為我們自動生成contextInitialized和contextDestroy兩個函式

監聽器>過濾器>serlvet,在 web.xml 檔案中配置的時候注意順序

4 監聽器的分類

按監聽的物件劃分,可以分為監聽

  • ServletContext物件
  • HttpSession物件
  • ServletRequest物件

按監聽的事件劃分

  • 域物件自身的建立和銷燬
  • 域物件中屬性的建立和消除
  • 繫結到session中的某個物件的狀態

由於很多監聽的方式一致,因此我們只考慮其中的HttpSession物件:

在web.xml中配置session超時

1 2 3 <session-config> <session-timeout> 30 </session-timeout> </session-config>

當超過30秒後,session會自動過期

1 2 3 4 5 6 7 8 9 public class MyRequestListener implements HttpSessionListener{ public void sessionCreate(HttpSessionEvent event){ System.out.println("event 建立:"); } public void sessionDestroy(HttpSessionEvent event){ System.out.println("event 銷燬:"); } }

另外,我們可以實現HttpSessionAttributeListener來實現session物件屬性的增加(added)、刪除(removed)、替換(replaced)的功能

1 2 3 4 5 6 7 8 9 10 11 12 13 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、實戰

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 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; //建立一個線上使用者的列表 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; }

注意,以上程式碼只是大致的程式碼,並不全面和正確。