监听器(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如何对各种组件进行管理用更加清晰的认识。
如果觉得文章对你有帮助,那么就点赞评论支持一下吧!!!