天天看點

監聽器(Listener)

目錄

監聽器的作用:

監聽器的類别:

監聽器分類:

動手項目:添加監聽器,每次有使用者進行通路時,在本地硬碟添加記錄:

監聽器的作用:

  在某個事件觸發的時候,激活監聽器,執行預定的操作

監聽器的類别:

在Servlet規範中定義了多種類型的監聽器,它們用于監聽的事件源分别為SerlvetConext,HttpSession和ServletRequest這三個域對象。

監聽器分類:

監聽器的分類 監聽域對象本身的建立與銷毀(3個)

          ServletRequestListener    

          HttpSessionListener

         ServletContextListener 均有兩個方法(建立和删除)

監聽域對象中屬性的增、删、改的監聽器(3個)

          ServletContextAttributeListener,

          HttpSessionAttributeListener,

         ServletRequestAttributeListener 均有3個方法(增、删、改) 以上兩類監聽器必須在web.xml中注冊才可以

監聽器的分類 感覺型監聽器(2個):

監聽自己何時被綁到session,何時解綁;何時被鈍化,何時被活化

HttpSessionBindingListener 實作該接口的類能檢測自己何時被綁定和解綁

HttpSessionActivationListener 實作該接口的類能監測自己何時随着HttpSession一起活化和鈍化。

鈍化:序列化到硬碟上

活化:反序列化到記憶體中 該類監聽器不需要再web.xml中注冊,但是需要相應的類實作對應接口

動手項目:添加監聽器,每次有使用者進行通路時,在本地硬碟添加記錄:

首先修改xml中的檔案:

<listener>
        <listener-class>com.bjsxt.listener.LoginListener</listener-class>
    </listener>           

在com.bjsxt的包下建立LoginListener,因為每次通路都要發送一個Request請求,是以我們選擇request監聽器:

package com.bjsxt.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import static java.io.FileDescriptor.out;
//實作ServletRequestListener接口
public class LoginListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        HttpServletRequest request= 
        (HttpServletRequest)servletRequestEvent.getServletRequest();
        String add=request.getRemoteAddr();
        String url=request.getRequestURL().toString();
        String name=request.getServerName();
        String message="add: "+add+" url: "+url+" name: "+name;
        PrintWriter printWriter= null;
        try {
            printWriter = new PrintWriter(new FileWriter("G://message.log",true));
        } catch (IOException e) {
            e.printStackTrace();
        }
        printWriter.write(message);
        printWriter.close();
    }
}
           

每次有使用者對頁面進行通路,發起request請求,硬碟裡便能夠寫下一條記錄。

繼續閱讀