Listener总结(上)

Servlet监听器的总结,仅为个人的理解

一、ServletContext

1、ServletContextListener

当ServletContext初始化时Servlet容器会调用所有已部署的ServletContextListener的contextInitialized()方法

当ServletContext销毁时,Servlet容器会调用所有部署的ServletContextListener的contextDestory()方法

package javaweb.web.listener;
​
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
​
public class PeopleCountListener implements ServletContextListener {
​
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext 已创建"+sce.toString());
//        ServletContext 已创建javax.servlet.ServletContextEvent
//                [source=org.apache.catalina.core.ApplicationContextFacade@1a994d1]
​
    }
​
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext 已销毁"+sce.toString());
//        ServletContext 已销毁javax.servlet.ServletContextEvent
//                [source=org.apache.catalina.core.ApplicationContextFacade@1a994d1]
    }
}

        就是在web程序启动的时候,所有在web.xml中配置的Lintener都要进行初始化,就会调用Initialized方法。同理在web程序关闭的时候要注销所有的Lintener,在注销之前或调用Destory方法

        监听Servlet初始化和销毁的时机,进行准备和清理的工作

2、ServletContextAttributeLintener

        当一个ServletContext的属性被添加删除或者替换时,这个接口的实现类会收到相应的消息

package javaweb.web.listener;
​
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
​
public class ServletContextAttribute implements ServletContextAttributeListener {
    //ServletContext属性添加所响应的方法
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("Add Attribute"+event.getName()+"="+event.getValue());
    }
    //ServletContext属性删除所响应的方法
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("Remove Attribute"+event.getName()+"="+event.getValue());
    }
    //ServletContext属性被替换所响应的方法
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("Replace Attribute"+event.getName()+"="+event.getValue());
    }
}

        使用场景为:监听ServletContext的属性操作

二、Session Listener

HttpSession相关的监听接口有四个!

1、HttpSessionListener:监听HttpSession的创建/销毁

可以通过监听HttpSession的数量来统计并发用户的在线数量

package javaweb.web.listener;
​
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.concurrent.atomic.AtomicInteger;
​
//同时实现两个接口,ServletContextListener负责根据web程序的启动创建和销毁“在线人数”属性
//HttpSessionListener负责监听session的创建和注销事件,并及时的对“在线人数”属性的数值做修改
public class HttpSession implements HttpSessionListener,ServletContextListener{
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //通过事件拿到对应用户的Session,通过Session获取ServletContext中的动态Web属性userCount
        //使用原子操作的Integer,避免线程不安全
        AtomicInteger userCount = (AtomicInteger) se.getSession()
                .getServletContext().getAttribute("userCount");
        //用户数加一
        System.out.println("session user online = "+userCount.incrementAndGet());
    }
​
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        //和上面的方法思路一样
        AtomicInteger userCount = (AtomicInteger) se.getSession().getServletContext()
                .getAttribute("userCount");
        //用户数减一
        System.out.println("session online = "+userCount.decrementAndGet());
    }
​
    @Override
    public void contextInitialized(ServletContextEvent sce) {
*        sce.getServletContext().setAttribute("userCount",new AtomicInteger(0));
        System.out.println("ServletContext has Init:userCount = 0");
​
    }
​
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        sce.getServletContext().removeAttribute("userCount");
        System.out.println("ServletContext has close!");
    }
}

2、HttpSessionAttributeListener

和ServletContextAtributeListener一样,只不过它响应的是HttpSession范围的属性添加、删除、替换事件。

3、HttpSessionBindingListener

        用来捆绑监听Session

从监听范围上来讲,HttpSessionAttributeListener在web.xml中设置一次就可以监听到所有的session

但是HttpSessionBindingListener是和Session一对一的

所以HttpSessionBindingListener具有一定的优势,让每一个Session都对应一个Listener,这样就不用像

HttpsessionListenter每次都去session中读取用户属性,维护性更强

4、HttpSessionActivationListener

        实现会话的持久化,一般来说在服务器关闭的时候Session的时候用户的session就不见了,假设用户正在

服务器上工作,服务器突然关闭了,就造成很大的损失。所以就要实现会话的持久化

就是即使在重新启动了Session的时候用户的session还是存在。就是在服务器关闭的时候,把用户的session存储到硬盘了(钝化),这样

session就会被存储下来。服务器重新启动的时候,再把session从内存中读取出来,这个操作叫做活化,所以用户的信息就不会丢失了。

三、ServletRequest

1、ServletRequestListener

响应一个ServletRequest的创建或者删除

package javaweb.web.listener;
​
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
​
public class MyServletRequest implements ServletRequestListener{
​
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        ServletRequest request = sre.getServletRequest();
        long starttime = (long) request.getAttribute("start");
        long end_time = System.nanoTime();
        String URL = ((HttpServletRequest)request).getRequestURI();
        System.out.println("Request:"+URL+"costtime:"+(end_time-starttime)/1000+"ms");
​
    }
​
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        long time = System.nanoTime();
        ServletRequest servletRequest = sre.getServletRequest();
        servletRequest.setAttribute("start",time);
    }
}

8.ServletRequestAttributeListener:响应ServletR0equest范围的属性添加,删除,修改事件

类似于HttpSessionAttributeListener

四、常用的八大Servlet监听器:

request:

RequestListener:监听请求

RequestAttributeListener:监听请求中属性的增删改

Servlet:

ServletContextListener:监听web程序

ServletContextAttributeListener:监听共享属性的增删改

Session:

HttpSessionListener:监听session对象的添加和删除

HttpSessionAttributeListener:监听Session中属性的增删改

HttpSessionActivationListener:session持久化

HttpSessionBindingListener:捆绑监听session,一对一

事件类关系图(不存在HttpSessionAttributeEvent事件)

注意:如果监听器的事件类型含有子类的事件类型,那么如果子类的事件类型发生,那么此监听器也会产生响应。

先总结到这里,希望大佬能给出一些指点,本人对这里的了解不是很深。

猜你喜欢

转载自blog.csdn.net/qq_38449518/article/details/82354894