首页 > 代码库 > Servlet监听器笔记总结

Servlet监听器笔记总结

监听器Listener的概念

  监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应.

  Servlet中的也有实现监听器的机制,就是Listener,Listener是一个实现特定接口的普通java程序,专门用来监听另一个java对象的方法调用或属性改变,当被监听对象发生变动时,监听器某个方法立即被执行.

监听器Listener的使用场景

  理解了概念,接下来问题就来了,监听器Listener有哪些使用场景呢?

  在使用Spring框架开发javaWeb项目时,我们都会在web.xml中加入一个Listener,叫ContextLoaderListener.

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

  它的作用是,在启动web容器时,自动装配ApplicationContext的配置信息,初始化好Spring的IOC容器,这样就可以在项目启动的时候马上就可以去IOC容器中取到我们需要的对象.

  这个ContextLoaderListener就扮演的是一个监听器的角色,它实现了一个ServletContextListener接口,ServletContextListener中有两个方法:

public interface ServletContextListener extends EventListener {
    void contextInitialized(ServletContextEvent var1);
    void contextDestroyed(ServletContextEvent var1);
}

  当ServletContext对象创建,即容器启动时,监听器监听到了这一动作,就会调用contextInitialized这个方法,完成ApplicationContext的装配初始化工作.

/**
     * Initialize the root web application context.
     */
    public void contextInitialized(ServletContextEvent event) {
        this.contextLoader = createContextLoader();
        if (this.contextLoader == null) {
            this.contextLoader = this;
        }
        this.contextLoader.initWebApplicationContext(event.getServletContext());
    }

  initWebApplicationContext就是用来初始化IOC容器的方法.

  大概理通了这个流程,我们来看看更多Listener的使用场景:

  1.在系统启动时加载初始化信息

  2.统计网站的访问量

  3.统计在线人数和在线用户

  4.运用在一些框架(如Spring)中完成特定功能.

使用Listener的步骤

1.新建一个java类实现XXXListener接口,实现代码逻辑

2.在Web.xml注册自己新建的Listener

Listener的启动顺序

  Listener的启动优先级是大于过滤器的,即Listener>Filter>Servlet

  如果有很多Listener类,那么Listener的作用时机是根据你在web.xml中注册的顺序来决定的,即按照从上往下的顺序来加载.

Servlet中常用的Listener接口

1.按照域对象的创建和销毁来分类

public class MyServletContextListener implements ServletContextListener{

//servletContext创建时调动此方法(容器启动)
    public void contextInitialized(ServletContextEvent servletContextEvent) {
    }
//servletContext销毁时调用此方法(容器关闭)
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
}

   相同类型的Listener的还有HttpSessionListener,ServletRequestListener.

2.按照域中属性的增加移除来分类

public class MyApplicationAttributeListener implements ServletContextAttributeListener {
   //当Application域中属性增加时调用此方法
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
    }
//当Application域中属性移除的时候调用此方法
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
    }
//当Application域中对象被更新时调用此方法
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
    }
}

  相同类型的Listener还有HttpSessionAttributeListener,ServletRequestAttributeListener

3.监听HttpSession域中某个具体对象状态的Listener

  这种Listener比较特别,以上介绍的几种都需要在web.xml中注册监听器,而这种不需要,为什么呢,看代码比较好理解:

public class User implements HttpSessionBindingListener {
    private String username;
    private String password;
//当session域中绑定了User对象时调用此方法
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
    }
//当session域中移除了User对象绑定时调用此方法
    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
    }
}

相同类型的还有还有一种 HttpSessionActivationListener,涉及session域中对象的序列化和反序列化.

Servlet监听器笔记总结