SpringBoot监听器的使用方法

SpringBoot监听器的使用方法贯穿于当前的 WEB 应用的生命周期 当前 WEB 应用被加载时创建 application 对象 当前 WEB 应用被卸载时销毁 application 对象

欢迎大家来到IT世界,在知识的湖畔探索吧!

前言

监听器(Listener)就是监听对象的创建、销毁等状态的变化以及定义一些事件发生后接下来要进行的动作。主要监听的三个域对象为:ServletRequest域、HttpSession域 和ServletContext域。本文通过几个简单的例子介绍一下监听器的用法。

ServletContextListener监听 Servlet上下文

监听 Servlet 上下文对象可以在系统启动的时候初始化一些数据,方便在使用的时候直接调用。监听器实现代码如下:

@Component public class MyServletContextListener implements ServletContextListener { @Override //在 ServletContext 对象创建之后马上调用,做初始化 public void contextInitialized(ServletContextEvent event) { event.getServletContext().setAttribute("name","九天银河聊编程"); System.out.println("ServletContext 对象被创建了"); } @Override // 在 ServletContext 对象销毁之后调用 public void contextDestroyed(ServletContextEvent event) { System.out.println("ServletContext 对象被销毁了"); } }

欢迎大家来到IT世界,在知识的湖畔探索吧!

欢迎大家来到IT世界,在知识的湖畔探索吧! @GetMapping("/getServletContext") public String getServletContext(HttpServletRequest request) { ServletContext servletContext = request.getServletContext(); Object name = servletContext.getAttribute("name"); return String.valueOf(name); }

执行效果如下:

SpringBoot监听器的使用方法



欢迎大家来到IT世界,在知识的湖畔探索吧!

HttpSessionListener获取在线用户数量

@Component public class MyHttpSessionListener implements HttpSessionListener { public static Integer count = 0; @Override public void sessionCreated(HttpSessionEvent event) { count++; ServletContext application = event.getSession().getServletContext(); application.setAttribute("UserCount", count); System.out.println("有人上线了,现在在线人数为:" + count + "人"); } @Override public void sessionDestroyed(HttpSessionEvent event) { count--; ServletContext application = event.getSession().getServletContext(); application.setAttribute("UserCount", count); System.out.println("有人下线了,现在在线人数为:" + count + "人"); } }
欢迎大家来到IT世界,在知识的湖畔探索吧!@GetMapping("/online") public String getOnlinePersoncount(HttpServletRequest request) { Integer userCount = (Integer) request.getServletContext().getAttribute("UserCount"); return (userCount == null ? "0" : userCount + ""); } @GetMapping("/login") public String logined(HttpSession session) { //相同的session,如果sessionid一致,只会被监听一次。 session.setAttribute("username", "九天银河聊编程"); return "success"; } @GetMapping("/logout") public String logout(HttpSession session) { session.invalidate();//将session设置为失效 return "success"; }

执行 127.0.0.1:8090/login,控制台显示:

SpringBoot监听器的使用方法

执行 127.0.0.1:8090/online,返回

SpringBoot监听器的使用方法

执行 127.0.0.1:8090/logout,控制台显示

SpringBoot监听器的使用方法

ServletRequestListener统计网站访问次数

@Component public class MyServletRequestListener implements ServletRequestListener { @Override public void requestInitialized(ServletRequestEvent servletRequestEvent) { Object countObject = servletRequestEvent.getServletContext().getAttribute("count"); System.out.println("历史访问次数:" + countObject); Integer count = 0; if (countObject != null) count = Integer.valueOf(countObject.toString()); count++; servletRequestEvent.getServletContext().setAttribute("count", count); } @Override public void requestDestroyed(ServletRequestEvent servletRequestEvent) { System.out.println("当前访问次数:" + servletRequestEvent.getServletContext().getAttribute("count")); } }

随便执行一个接口请求,控制台打印如下:

SpringBoot监听器的使用方法

再次执行:

SpringBoot监听器的使用方法

自定义监听方式

定义监听事件

欢迎大家来到IT世界,在知识的湖畔探索吧!ublic class ListenerEvent extends ApplicationEvent { String name = null; public String getName() { return name; } public void setName(String name) { this.name = name; } public ListenerEvent(Object source, String value) { super(source); name = value; } }

定义监听器

@Component public class MySpringBootListener implements ApplicationListener 
  
    { @Override public void onApplicationEvent(ListenerEvent listenerEvent) { String eventInfo = listenerEvent.getName(); System.out.println(eventInfo); } } 
  

发布事件

欢迎大家来到IT世界,在知识的湖畔探索吧!@RestController public class ListenerController { @Resource private ApplicationContext applicationContext; @GetMapping("/listener") public String listener() { ListenerEvent event =new ListenerEvent(this,"九天银河聊编程"); applicationContext.publishEvent(event); return ""; } }

执行 127.0.0.1:8090/listener,控制台显示

SpringBoot监听器的使用方法

监听器说明

在目前的Servlet API中提供的web事件监听器接口有以下几个:

ServletContextListener -- 监听servletContext对象的创建以及销毁 contextInitialized(ServletContextEvent event) -- 创建时执行 contextDestroyed(ServletContextEvent event) -- 销毁时执行 HttpSessionListener -- 监听session对象的创建以及销毁 sessionCreated(HttpSessionEvent event) -- 创建时执行 sessionDestroyed(HttpSessionEvent event) -- 销毁时执行 ServletRequestListener -- 监听request对象的创建以及销毁 requestInitialized(ServletRequestEvent event) -- 创建时执行 requestDestroyed(ServletRequestEvent event) -- 销毁时执行 ServletContextAttributeListener -- 监听servletContext对象中属性的改变 attributeAdded(ServletContextAttributeEvent event) -- 添加属性时执行 attributeReplaced(ServletContextAttributeEvent event) -- 修改属性时执行 attributeRemoved(ServletContextAttributeEvent event) -- 删除属性时执行 HttpSessionAttributeListener --监听session对象中属性的改变 attributeAdded(HttpSessionBindingEvent event) -- 添加属性时执行 attributeReplaced(HttpSessionBindingEvent event) -- 修改属性时执行 attributeRemoved(HttpSessionBindingEvent event) -- 删除属性时执行 ServletRequestAttributeListener --监听request对象中属性的改变 attributeAdded(ServletRequestAttributeEvent event) -- 添加属性时执行 attributeReplaced(ServletRequestAttributeEvent event) -- 修改属性时执行 attributeRemoved(ServletRequestAttributeEvent event) -- 删除属性时执行

生命周期

request

指一个URL请求,当发送一个请求时被创建,当一个响应返回时,即被销毁。

session

​ 当一个客户端访问一个WEB应用时创建,标记一个用户与服务器之间的多次请求。session失效有以下几个情况:

  • session 过期,即用户长时间不访问服务器造成过期
  • 用户退出系统,即执行session 的 invalidate 方法,清理session
  • 当前 web 应用被卸载(session 未被持久化)

application

​ 贯穿于当前的 WEB 应用的生命周期,当前 WEB 应用被加载时创建 application 对象,当前 WEB 应用被卸载时销毁 application 对象。

每天一个小知识,每天进步一点点!!!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/114068.html

(0)
上一篇 9分钟前
下一篇 2025年 2月 9日 下午3:55

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信