监听器Listener

226 阅读1分钟

Listener概述

监听器Listener 是 监听某个组件变化的对象.

  • 事件源是固定的,主要是request, session, servletcontext域对象

  • 监听的是域对象变化

    • 对象的创建和销毁, 域对象中存储的数据变化
  • 第一个维度划分:

    • 监听的域对象request, session, servletcontext

      域对象监听器
      requestServletRequestListener
      sessionHttpSessionListener
      servletcontextServletContextListener
  • 第二个维度划分:

    • 监听的域对象的状态 也就是

    1. 对象的创建和销毁,
    2. 域对象中存储的数据变化

ServletContext监听器入门

用于监听 servletcontext域对象, 对象的创建和销毁, 域对象中存储的数据变化

实现步骤

  • 创建类实现监听器接口 ServletContextListener
  • 重写抽象方法
  • 注解方式 配置 Listener
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    /**
     *  ServletContext对象,被创建,调用
     */
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext域对象创建");
    }

    @Override
    /**
     *   ServletContext对象,被销毁前调用
     */
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext域对象销毁");
    }
}
  • web.xml配置方式 Listener
<listener>
    <listener-class>com.itheima.listener.MyServletContextListener</listener-class>
</listener>

监听器事件对象 ServletContextEvent

ServletContextEvent: 是ServletContext域对象的事件对象, 此对象由tomcat引擎创建ServletContext

  • 方法:

    • Object getSource()获取到被监听的事件源
    • ServletContext getServletContext() 获取到被监听的事件源
  • 小结:

    • 两个方法 除了返回值外,功能实现是一致的, 设计目的为了通用性
    • 其他的监听器事件对象(HttpSessionEvent, ServletRequestEvent), 都有共同的方法 getSource()
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    /**
     *  ServletContext对象,被创建,调用
     */
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext域对象创建");
        ServletContext context = (ServletContext) servletContextEvent.getSource();
        System.out.println(context);

        ServletContext servletContext = servletContextEvent.getServletContext();
        System.out.println(servletContext);
    }

    @Override
    /**
     *   ServletContext对象,被销毁前调用
     */
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext域对象销毁");
    }
}