监听器概述
监听器
现实生活中的监听流程:
现实生活中的监听器的定义
监听器是专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监听对象发生变化
时,立即采取相应的行动。
Web监听器
下面是统计用户在线人数的监听流程:
Web监听器
Web监听器在Servlet规范下:
Web监听器是Servlet规范中定义的一种特殊类。
Web监听器用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件。
Web监听器用于监听域对象的属性发生修改的事件。
Web监听器可以在事件发生前,可以在发生后做出一些必要的处理。
监听器的主要用途
1)统计在线人数和在线用户
2)系统启动时加载初始化信息
3)统计网站访问量
4)跟Spring整合5)便于自动化管理
6)可以活化钝化人数和日志,便于服务器的关闭和重启。
第一个Web监听器实例讲解
创建Web监听器的步骤
1)创建一个实现监听器接口的类
2)使用注解或者配置web.xml文件
第一个Web监听器实例
FirstListener.java源代码:
package com.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /** * Application Lifecycle Listener implementation class FirstListener * */ @WebListener("This is first Listener") public class FirstListener implements ServletContextListener { /** * Default constructor. */ public FirstListener() { } /** * @see ServletContextListener#contextInitialized(ServletContextEvent) */ public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized"); } /** * @see ServletContextListener#contextDestroyed(ServletContextEvent) */ public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("contextDestroyed"); } }
运行结果:
我们编一个JSP页面,然后启动Tomcat服务器,访问这个JSP页面就会得到如下结果。
监听器的启动顺序
按照web.xml配置文件中的注册监听器的顺序进行,注解无法达到这种效果。
Web项目中的三大组件Servlet、Filter以及Listener的启动顺序是:
监听器的分类
(1)按照监听的对象划分
1)用于监听应用程序环境对象(ServletContext)的事件监听器
2)用于监听用户会话对象(HttpSession)的事件监听器
3)用于监听请求信息对象(ServletRequest)的事件监听器
(2)按照监听的事件划分
1)监听域对象自身的创建和销毁的事件监听器
2)监听域对象中的属性的增加和删除的事件监听器
3)监听绑定到HttpSession域中的某个对象的状态的事件监听器
Web八大监听器详解
我们根据第二种分类进行详细的讲解
ServletContextListener实例
MyServletContextListener.java源代码:
package com.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /** * Application Lifecycle Listener implementation class FirstListener * */ @WebListener public class MyServletContextListener implements ServletContextListener { /** * Default constructor. */ public MyServletContextListener() { } /** * @see ServletContextListener#contextInitialized(ServletContextEvent) */ public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized"); } /** * @see ServletContextListener#contextDestroyed(ServletContextEvent) */ public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("contextDestroyed"); } }
运行结果:
HttpSessionListener实例
MyHttpSessionListener.java源代码:
package com.listener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; /** * Application Lifecycle Listener implementation class MyHttpSessionListener * */ @WebListener public class MyHttpSessionListener implements HttpSessionListener { /** * Default constructor. */ public MyHttpSessionListener() { } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("sessionCreated"); } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("sessionDestroyed"); } }
运行结果:
ServletRequestListener实例
MyServletRequest.java源代码:
package com.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; /** * Application Lifecycle Listener implementation class MyServletRequestListener * */ @WebListener public class MyServletRequestListener implements ServletRequestListener { /** * Default constructor. */ public MyServletRequestListener() { } /** * @see ServletRequestListener#requestDestroyed(ServletRequestEvent) */ public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("requestDestroyed"); } /** * @see ServletRequestListener#requestInitialized(ServletRequestEvent) */ public void requestInitialized(ServletRequestEvent servletRequestEvent) { System.out.println("requestInitialized"); } }
运行结果:
以上几个监听器使用的JSP页面为: