监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

         这篇文章将介绍监听器是什么,如何使用,并且通过代码的编写来说明。彻底解决大家对于监听器的各种疑惑。


目录

 介绍

监听器接口

常用监听器使用

监听器配置

xml方式配置

 注解方式 

ServletContextListener

HttpSessionListener 

HttpSessionAttributeListener

 总结


 介绍

        监听器一般是用来对某些对象创建/销毁,数据发生改变时进行监听的,我们通过监听器就可以在这些对象发生改变时进行相应的处理。

        在javaWeb中,监听器是接口,我们使用监听器需要实现这些接口。


监听器接口

        监听器接口一个有8个,通过这8个接口,我们基本可以实现对整个web项目的监听,8个接口如下:

  • ServletRequestListener:用于监听request对象创建/销毁的
  • ServleRequestAttributeListener:用于监听request域里面数据变化
  • HttpSessionListener:用于监听session对象创建/销毁
  • HttpSessionAttributeListener:用于监听session域里面的数据变化
  • HttpSessionBindingListener:处理session对象监听器绑定和解绑(后面文章详解)
  • HttpSessionActivationListener:处理session对象钝化和活化(后面文章详解)
  • ServletContextListener:用于监听ServletContext对象创建/销毁
  • ServletContextAttributeListener:用于监听ServletContext域里面数据变化

常用监听器使用

        我们如果不清楚哪些是常用的监听器,那么我们直接使用idea的快捷方式来创建一个监听器,默认实现的接口就是常见的。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

        我们创建了一个TestListener监听器,查看类图,发现idea默认就是实现了ServletContextListener,HttpSessionListener,HttpSessionAttributeListener这3个接口,下面我们就来对这几个接口进行学习,其他接口都是类似的。


监听器配置

        我们创建了监听器肯定要告诉tomcat(服务器)才行,监听器和Servlet一样,也有2种配置方式,分别是xml和注解。

xml方式配置

        我们在web.xml文件中写如以下内容:

<listener>
    <listener-class>监听器的全路径</listener-class>
</listener>

 注解方式 

        注解方式配置十分简单,我们在自己写的监听器类上面加上@WebListener就行了。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)


 ServletContextListener

        我们直接创建一个类来实现这个接口,然后查看里面的方法。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

         我们实现这个方法,然后启动tomcat进行测试。

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServletContextListenerTest implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //通过这个sce,可以获取到ServletContext
        //ServletContext servletContext = sce.getServletContext();
        System.out.println("ServletContext初始化了......");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext被销毁了......");
    }
}

         我们将监听器在xml文件中配置后启动tomcat,查看输出

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

        我们发现在tomcat后监听器就已经监听到了ServletContext的创建,并且监听器调用了对应的方法。接下来,我们来关闭tomcat,查看输出。  

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

         我们在关闭tomcat时,ServletContext也就销毁了,监听器监听到了ServletContext销毁,并且调用了相应的方法。

        我们通过这个监听器,就可以在tomcat(服务器)启动/销毁时做相应的工作,例如初始化文件,保存文件,发送通知等等。


HttpSessionListener 

        我们还是老样子,创建类,实现HttpSessionListener接口。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

         实现接口,进行测试。注意,需要将监听器配置在web.xml文件中或添加相应的注解@WebListener,我将监听器配置在了web.xml文件中。

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class HttpSessionListenerTest implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //通过HttpSessionEvent可以获取到session
        HttpSession session = se.getSession();
        String id = session.getId();
        System.out.println("创建了新的session,id为:" + id);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        //通过HttpSessionEvent可以获取到session
        HttpSession session = se.getSession();
        String id = session.getId();
        System.out.println("销毁了一个session,id为:" + id);
    }
}

         创建一个Servlet来设置session的生命周期,我们把session的生命周期设置成10秒,方便演示。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/createSession")
public class CreateSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //得到session
        HttpSession session = req.getSession();
        //将session设置为10秒
        session.setMaxInactiveInterval(10);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

        启动tomcat,然后访问servlet,查看控制台输出。

访问servlet,控制台输出如下 

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener) 等待10秒后,控制台输出如下

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

        说明我们的监听器就成功监听到了session的创建与销毁。并且在session创建/销毁时调用了相应的方法。

        这个监听器一般用来统计在线人数,监听用户上线离线等 


HttpSessionAttributeListener

        我们依然是创建一个类实现HttpSessionAttributeListener接口来演示这个功能。注意要配置监听器。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

在这些方法里面有一个HttpSessionBindingEvent对象,通过这个对象我们可以获取到session的信息,HttpSessionBindingEvent类图与方法如下: 

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

         我们实现这3个接口,然后进行演示。

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class HttpSessionAttributeListenerTest implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        //se可获取到session,然后获取到session的id
        String id = se.getSession().getId();
        //得到session创建的name和value
        String name = se.getName();
        Object value = se.getValue();
        System.out.println("sessionId为:" + id + "的添加了一个新的属性  name:" + name + " value:" + value);
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        //se可获取到session,然后获取到session的id
        String id = se.getSession().getId();
        //得到session创建的name和value
        String name = se.getName();
        Object value = se.getValue();
        System.out.println("sessionId为:" + id + "的移除了一个属性  name:" + name + " value:" + value);
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        //se可获取到session,然后获取到session的id
        String id = se.getSession().getId();
        //得到session创建的name和value
        String name = se.getName();
        //这个为旧值,也就是替换前的值
        Object value = se.getValue();
        //得到新的值
        Object newValue = se.getSession().getAttribute(name);
        System.out.println("sessionId为:" + id + "的替换了一个的属性  name:" + name
                + " 替换前value:" + value + " 替换后value:" + newValue);
    }
}

         创建一个Servlet来操作session。

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/operatorSession")
public class OperatorSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到session
        HttpSession session = request.getSession();
        //设置name
        session.setAttribute("name","孙悟空");
        //替换name
        session.setAttribute("name","齐天大圣");
        //移除name
        session.removeAttribute("name");
    }

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

         其他tomcat,然后访问Servlet,查看控制台输出。

监听器(Listener)模模糊糊?那你该看看这篇文章了,一篇文章彻底搞懂监听器(Listener)

         我们的确通过HttpSessionAttributeListener监听器实现了对session属性的监听,并且也调用了相应的方法。


 总结

        通过上面3个常用监听器的介绍和练习,相信大家对监听器有了更加清晰的认识,另外的几个监听器用法也大致相同,除了HttpSessionBindingListener和HttpSessionActivationListene,这2个监听器我在后面单独写文章来进行讲解。

        如果你对tomcat如何实现监听器十分模糊,建议查看我写的【手写Tomcat】系列,自己写一个简易的tomcat,这样就会对tomcat如何对各种组件进行管理用更加清晰的认识。

        如果觉得文章对你有帮助,那么就点赞评论支持一下吧!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/140293.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!