1. 程式人生 > 實用技巧 >Javaweb之監聽器的使用

Javaweb之監聽器的使用

概念:

監聽器,簡單理解就是監聽觀察某個事件的發生情況,當被監聽的事件發生,事件發生者(事件源) 就會給註冊該事件的監聽者(監聽器)傳送訊息,將某些資訊傳遞給監聽者,同時監聽者也可以獲得一份事件物件,根據這個物件可以獲得相關屬性和執行相關操作。

監聽器模型涉及以下三個物件,模型圖如下:

(1)事件:使用者對元件的一個操作,或者說程式執行某個方法,稱之為一個事件。

(2)事件源:發生事件的元件就是事件源,也就是被監聽的物件。

(3)事件監聽器(處理器):監聽並負責處理事件的方法。

監聽器的實現:

這裡舉一個例子,顯示網站的當前線上人數。要實現這個功能,需要用到session技術,當用戶使用瀏覽器訪問某個網站時,馬上就會產生一個session的ID,我們只需要統計session的個數,即可獲取到當前正在訪問該網站的人數。

實現顯示網站人數的監聽器主要有三個步驟:

  • 編寫一個監聽類,實現的是HttpSessionListener介面;

  • 在index.jsp中獲取並顯示資料;

  • 在web.xml中註冊監聽器。

步驟一:編寫一個監聽類OnlineCountListener

package listener;
​
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
​
//統計網站線上人數,就是統計session
public class OnlineCountListener implements HttpSessionListener { ​ //建立session監聽,一旦建立就會觸發一次這個事件 public void sessionCreated(HttpSessionEvent httpSessionEvent) { ServletContext context = httpSessionEvent.getSession().getServletContext(); ​ System.out.println(httpSessionEvent.getSession().getId()); ​ Integer OnlineCount
= (Integer) context.getAttribute("OnlineCount"); ​ if (OnlineCount==null){ OnlineCount = new Integer(1); }else { int count = OnlineCount.intValue(); OnlineCount = new Integer(count+1); } ​ context.setAttribute("OnlineCount",OnlineCount); } ​ //銷燬session監聽 public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext context = httpSessionEvent.getSession().getServletContext(); ​ Integer OnlineCount = (Integer) context.getAttribute("OnlineCount"); ​ if (OnlineCount==null){ OnlineCount = new Integer(0); }else { int count = OnlineCount.intValue(); OnlineCount = new Integer(count-1); } ​ context.setAttribute("OnlineCount",OnlineCount); } ​ /* * session的銷燬: * 手動銷燬:getSession().invalidate(); * 自動銷燬:設定過期*/ } ​

在index.jsp中獲取並顯示資料:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <h1>當前有:<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人線上</h1>
  </body>
</html>

在web.xml中註冊監聽器:

<!--註冊監聽器-->
    <listener>
        <listener-class>listener.OnlineCountListener</listener-class>
    </listener>