web.xml監聽器 - 函數回調
(面向事件編程概念)
<listener> <listener-class>com.kiqi.listener.MyListener</listener-class> </listener>
一、監聽器類型
1.Listener是Servlet的監聽器
2.可以監聽客戶端的請求、服務端的操作等。
3.通過監聽器,可以自動激發一些操作,如監聽在線用戶數量,當增加一個HttpSession時,給在線人數加1。
4.編寫監聽器需要實現相應的接口
5.編寫完成后在web.xml文件中配置一下,就可以起作用了
6.可以在不修改現有系統基礎上,增加web應用程序生命周期事件的跟蹤
二、監聽器類型
按監聽的對象(環境對象)划分:
1. 用於監聽應用程序環境對象(ServletContext的事件監聽器 - application
//ServletContextListener:用於對Servlet整個上下文進行監聽(創建、銷毀)。 public void contextInitialized(ServletContextEvent sce);//上下文初始化 public void contextDestroyed(ServletContextEvent sce);//上下文銷毀 public ServletContext getServletContext();//ServletContextEvent事件:取得一個ServletContext(application)對象 //ServletContextAttributeListener:對Servlet上下文屬性的監聽(增刪改屬性)。 public void attributeAdded(ServletContextAttributeEvent scab);//增加屬性 public void attributeRemoved(ServletContextAttributeEvent scab);//屬性刪除 public void attributeRepalced(ServletContextAttributeEvent scab);//屬性替換(第二次設置同一屬性) //ServletContextAttributeEvent事件:能取得設置屬性的名稱與內容 public String getName();//得到屬性名稱 public Object getValue();//取得屬性的值
2. 用於監聽用戶會話對象(HttpSession Listener)的事件監聽器 - session
//HttpSessionListener接口:對Session的整體狀態的監聽。 public void sessionCreated(HttpSessionEvent se);//session創建 public void sessionDestroyed(HttpSessionEvent se);//session銷毀 //HttpSessionEvent事件: public HttpSession getSession();//取得當前操作的session //HttpSessionAttributeListener接口:對session的屬性監聽。 public void attributeAdded(HttpSessionBindingEvent se);//增加屬性 public void attributeRemoved(HttpSessionBindingEvent se);//刪除屬性 public void attributeReplaced(HttpSessionBindingEvent se);//替換屬性 //HttpSessionBindingEvent事件: public String getName();//取得屬性的名稱 public Object getValue();//取得屬性的值 public HttpSession getSession();//取得當前的session public void invalidate();//使session失效方法 - session.invalidate();
3. 用於監聽請求消息對象(ServletRequest Listener)的事件監聽器 - request
//ServletRequestListener:用於對Request請求進行監聽(創建、銷毀) public void requestInitialized(ServletRequestEvent sre);//request初始化 public void requestDestroyed(ServletRequestEvent sre);//request銷毀 //ServletRequestEvent事件: public ServletRequest getServletRequest();//取得一個ServletRequest對象 public ServletContext getServletContext();//取得一個ServletContext(application)對象 //ServletRequestAttributeListener:對Request屬性的監聽(增刪改屬性)。 public void attributeAdded(ServletRequestAttributeEvent srae);//增加屬性 public void attributeRemoved(ServletRequestAttributeEvent srae);//屬性刪除 public void attributeReplaced(ServletRequestAttributeEvent srae);//屬性替換(第二次設置同一屬性) //ServletRequestAttributeEvent事件:能取得設置屬性的名稱與內容 public String getName();//得到屬性名稱 public Object getValue();//取得屬性的值
按監聽的事件類項划分
-
用於監聽域對象自身的創建和銷毀的事件監聽器
-
用於監聽域對象中的屬性的增加和刪除的事件監聽器
-
用於監聽綁定到HttpSession域中的某個對象的狀態的事件監聽器
1 import javax.servlet.ServletContextEvent; 2 import javax.servlet.ServletContextListener; 3 4 public class MyListener implements ServletContextListener { 5 public void contextDestroyed(ServletContextEvent sce) { 6 System.out.println("die"); 7 } 8 9 public void contextInitialized(ServletContextEvent sce) { 10 System.out.println("init"); 11 } 12 }
1 public class HttpSessionListenerImpl implements HttpSessionListener { 2 public void sessionCreated(HttpSessionEvent event) { 3 ServletContext app = event.getSession().getServletContext(); 4 int count = Integer.parseInt(app.getAttribute("onLineCount").toString()); 5 count++; 6 app.setAttribute("onLineCount", count); 7 int maxOnLineCount = Integer.parseInt(app.getAttribute("maxOnLineCount").toString()); 8 if (count > maxOnLineCount) { 9 //記錄最多人數是多少 10 app.setAttribute("maxOnLineCount", count); 11 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 12 //記錄在那個時刻達到上限 13 app.setAttribute("date", df.format(new Date())); 14 } 15 } 16 //session注銷、超時時候調用,停止tomcat不會調用 17 public void sessionDestroyed(HttpSessionEvent event) { 18 ServletContext app = event.getSession().getServletContext(); 19 int count = Integer.parseInt(app.getAttribute("onLineCount").toString()); 20 count--; 21 app.setAttribute("onLineCount", count); 22 } 23 }
參考:Listener 監聽器