JavaWeb 三大组件之监听器 Listener

  |   0 评论   |   0 浏览

JavaWeb 三大组件之监听器 Listener

1.官方文档

链接:https://pan.baidu.com/s/1Hk8Aq8Nk9_P1ucmaP4g3qA 
提取码:5kni

2.Listener 监听器介绍

1.Listener 监听器它是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程 序、Listener 监听器、Filter 过滤器

2.Listener 是 JavaEE 的规范,就是接口

3.监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化), 触发对应方法完成 相应的任务

4.JavaWeb 中的监听器(共八个), 目前最常用的是 ServletContextListener

image-20220319125029854

3.JavaWeb 的监听器

1.ServletContextListener 监听器

1.作用:监听 ServletContext 创建或销毁(当我们Web 应用启动时,就会创建 ServletContext), 即生命周期监听,

应用场景(1)加载初始化的配置文件;比如 spring 的配置文件 (2)任务调度(配合定时器 Timer/TimerTask)

2.相关方法

void contextInitialized(ServletContextEvent	sce) 创建Servletcontext	时触发	
void contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext 时

3.应用实例

同样是需要引入servlet-api.jar的依赖

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>
/**
 * 1. 当一个类实现了 ServletContextListener
 * 2. 该类就是一个监听器
 * 3. 该类可以监听的事件 由该类实现的监听接口决定 ,比如 实现ServletContextListener
 *    , 则该类就可以监听 ServletContext对象的创建和销毁, 以此类推
 * 4. MyServletContextListener 就是一个监听者
 * 5. 当web应用启动时,就会产生 ServletContextEvent 事件, 会调用监听器的对应事件处理方法
 *    contextInitialized, 同时会传递 事件对象
 * 6. 程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息, 然后再进行业务处理
 * 7. tomcat怎么知道这个监听器存在 ? 因为我们需要在web.xml中配置
 */
public class MyServletContextListener implements ServletContextListener {

    /**
     * 监听ServletContext的创建
     * @param sce
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("监听到 "+ sce.getServletContext()+"对象被创建");
    }

    /**
     * 监听ServletContext的销毁
     * @param sce
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("监听到 "+sce.getServletContext()+"对象被销毁");
    }
}

4.配置 web.xml

<!--在web.xml中配置了监听器类的全路径,tomcat可以通过反射的方式获取到监听器对象从而执行监听的方法-->
  <listener>
    <listener-class>com.llp.MyServletContextListener</listener-class>
  </listener>

5.完成测试

image-20220319163218306

2.ServletContextAttributeListener 监听器

1.作用:监听 ServletContext 属性变化

2.相关方法

void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用

3.应用案例

public class MyServletContextAttributeListener implements ServletContextAttributeListener {
    /**
     * 监听ServletContext对象属性的添加
     * @param event
     */
    @Override
    public void attributeAdded(ServletContextAttributeEvent event) {
        System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"被添加到ServletContext中");
    }

    /**
     * 监听ServletContext对象属性的删除
     * @param event
     */
    @Override
    public void attributeRemoved(ServletContextAttributeEvent event) {
        System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"从ServletContext中删除");
    }

    /**
     * 监听ServletContext对象属性的替换
     * @param event
     */
    @Override
    public void attributeReplaced(ServletContextAttributeEvent event) {
        System.out.println("监听到属性名"+event.getName()+"=属性值"+event.getValue()+"从ServletContext中替换");
    }
}

4.配置web.xml

<listener>
  <listener-class>com.llp.MyServletContextAttributeListener</listener-class>
</listener>

5.完成测试

image-20220319164715714

3.其它监听器-使用较少

1.HttpSessionListener 监听器

1.作用:监听 Session 创建或销毁,即生命周期监听

2.相关方法

void sessionCreated(HttpSessionEvent se) 创建session时调用	
void sessionDestroyed(HttpSessionEvent se) 销毁session 时调用

使用方法和前面一样, 可以用于监控用户上线,离线

3.应用实例

public class MyHttpSessionListener implements HttpSessionListener{
    /**
     * 监听session创建
     * @param se
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("监听到session对象:"+se.getSession()+"被创建,SessionId="+se.getSession().getId());
            //设置session 30秒过期
        se.getSession().setMaxInactiveInterval(20);
    }

    /**
     * 监听session销毁
     * @param se
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("监听到session对象:"+se.getSession()+"被销毁,SessionId="+se.getSession().getId());
    }
}
@WebServlet(name = "HttpSessionServlet",urlPatterns = {"/session"})
public class HttpSessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //如果session会话存在则获取session,如果不存在则创建session
        HttpSession session = request.getSession();

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

4.web.xml

<listener>
    <listener-class>com.llp.MyHttpSessionListener</listener-class>
  </listener>

5.测试

image-20220319172958511

2.HttpSessionAttributeListener 监听器

1.作用:监听 Session 属性的变化
2.相关方法

void attributeAdded(ServletRequestAttributeEvent srae)	添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae)	替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)	移除属性时

3.使用少 , 使用方法和前面一样。

3.ServletRequestListener 监听器

1.ServletRequestListener 监听器
2.作用:监听 Request 创建或销毁,即 Request 生命周期监听相关方法

void requestInitialized(ServletRequestEvent sre)	创建 request 时
void requestDestroyed(ServletRequestEvent sre)	销毁 request 时

3.可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况.

@WebListener()
public class MyRequestListener implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("MyRequestListener 监听到 request对象创建");
        ServletRequest servletRequest = servletRequestEvent.getServletRequest();
        System.out.println("记录访问日志....");
        System.out.println("访问IP= " + servletRequest.getRemoteAddr());
        System.out.println("访问的资源= " + ((HttpServletRequest)servletRequest).getRequestURL());
    }
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
		//request在一次请求之后就会被销毁
        System.out.println("HspRequestListener 监听到 request对象被销毁");
    }
}

4.ServletRequestAttributeListener 监听器

1.作用:监听 Request 属性变化

request.setAttribute("name","gukong");
        request.removeAttribute("name");

2.相关方法

void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时

3.使用方法和前面类似

5.HttpSessionBindingListener 感知监听器

HttpSessionBindingListener必须实例化后放入某一个session中解释:例如 session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));把我们自定义的监听类存储到session中,这个监听器就像“寄生虫”一样赋于该session上),才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener通常都是一对一的。

6.HttpSessionActivationListener 感知监听器

钝化和活化
1.钝化:就是序列化,把对象转化为字节序列,把Session对象从内存保存到硬盘里。(持久化操作)

2.活化:就是反序列化,把字节序列转化为对象,把Session对象从硬盘再读回内存。

HttpSessionActivationListener监控Session时必须把它添加到Session中,

HttpSessionActivation activation = new HttpSessionActivation();
session.setAttribute("Listener",activation);

所以当Session的序列化/反序列化执行的时候它都会监听到。此接口中有两个方法:

sessionWillPassivate(HttpSessionEvent):Session对象钝化之前执行

sessionDidActivate(HttpSessionEvent):Session对象活化后执行


标题:JavaWeb 三大组件之监听器 Listener
作者:llp
地址:https://llinp.cn/articles/2022/03/19/1647684424136.html