Servlet中的監聽器Listener

監聽器(Listener)

  1. 介紹及作用:監聽器是Servlet規範中定義的一種特殊類,用於監聽ServletContext、HttpSession和ServletRequest等域對象的創建和銷燬事件,它還可以監聽域對象的屬性發生修改的事件,可以在事件發生前或者發生後做一些必要的處理。

  2. 相關概念:
    a.事件源:被監聽的對象
    b.監聽器:監聽事件源對象 事件源對象的狀態的變化都會觸發監聽器
    c.註冊監聽器:將監聽器與事件源進行綁定
    e.響應行爲:監聽器監聽到事件源的狀態變化時 所涉及的功能代碼

  3. 監聽器的分類:
    按照監聽的事件可以將監聽器劃分爲以下三類:
    a.監聽域對象自身的創建和銷燬的事件監聽器;
    b.監聽域對象中屬性的增加和刪除的事件監聽器;
    c.監聽綁定到HttpSession域中某個對象狀態的事件監聽器。

  4. 主要的作用域:ServletContext、HttpSession、HttpServletRequest這三個對象中屬性變更信息事件的監聽器

  5. 監聽器中的方法:

方法 描述
attributeAdded () 當向被監聽對象中增加一個屬性時,web容器就調用事件監聽器的attributeAdded方法進行響應,這個方法接收一個事件類型的參數,監聽器可以通過這個參數來獲得正在增加屬性的域對象和被保存到域中的屬性對象
attributeRemoved() 當刪除被監聽對象中的一個屬性時,web容器調用事件監聽器的attributeRemoved方法進行響應
attributeReplaced() 當監聽器的域對象中的某個屬性被替換時,web容器調用事件監聽器的attributeReplaced方法進行響應
  1. 以統計學生在線人數爲例(HttpSessionAttributeListener)
@WebListener
public class OnlineListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("OnlineListener.attributeAdded");

        String name =  se.getName();
      
        //登錄用戶的session發生變化
        if("account".equals(name)){
            ServletContext application = se.getSession().getServletContext();
            int online_num = application.getAttribute("online_num") == null ? 0 : (Integer) application.getAttribute("online_num");
            System.out.println("online_num = " + online_num);
            online_num++;
            application.setAttribute("online_num",online_num);
        }

    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("OnlineListener.attributeRemoved");

        String name =  se.getName();
        //退出 用戶的session發生變化
        if("account".equals(name)){
            ServletContext application = se.getSession().getServletContext();
            int online_num = application.getAttribute("online_num") == null ? 0 : (Integer) application.getAttribute("online_num");
            System.out.println("online_num = " + online_num);
            online_num--;
            application.setAttribute("online_num",online_num);
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章