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

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

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


目录

 介绍

监听器接口

常用监听器使用

监听器配置

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的快捷方式来创建一个监听器,默认实现的接口就是常见的。

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


监听器配置

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

xml方式配置

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

    监听器的全路径

 注解方式 

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


 ServletContextListener

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

         我们实现这个方法,然后启动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,查看输出

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

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

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


HttpSessionListener 

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

         实现接口,进行测试。注意,需要将监听器配置在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,控制台输出如下 

 等待10秒后,控制台输出如下

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

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


HttpSessionAttributeListener

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

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

         我们实现这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,查看控制台输出。

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


 总结

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

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

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

中国象棋