本文共 3606 字,大约阅读时间需要 12 分钟。
Servlet容器在运行过程中会产生各种事件,而这些事件可以通过专门的监听器(Listener)来处理。Listener是一种用来监听事件并执行相应操作的组件,通过接口回调的方式实现底层原理。
Listener的主要作用是监听事件,事件类型主要围绕三个方面:
为了实现自定义的监听功能,需要开发符合接口或类的监听器。以下是一个简单的实现示例:
package com.lagou.demo03;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionBindingListener;public class Person implements HttpSessionBindingListener { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) { System.out.println("对象绑定到session中了" + httpSessionBindingEvent.getName()); } @Override public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) { System.out.println("解除绑定成功!"); }} 在 web.xml 文件中配置监听器:
com.lagou.demo03.MyRequestAttributeListener
为了实现记录当前在线用户数,可以利用 ServletContextListener 和 HttpSessionListener 组合使用。具体实现如下:
package com.lagou.demo04;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class OnlineUser implements HttpSessionListener, ServletContextListener { private ServletContext servletContext = null; @Override public void contextInitialized(ServletContextEvent servletContextEvent) { servletContext = servletContextEvent.getServletContext(); // 初始化全局属性 servletContext.setAttribute("count", 1); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { servletContext = null; } @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { System.out.println("有新用户上线了..."); Integer count = (Integer) servletContext.getAttribute("count"); count++; servletContext.setAttribute("count", count); } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { System.out.println("有用户已下线..."); Integer count = (Integer) servletContext.getAttribute("count"); if (count > 0) { count--; servletContext.setAttribute("count", count); } }} 在 web.xml 中配置:
com.lagou.demo04.OnlineUser
conf/context.xml 中配置,可更改存储路径。work 目录下的钝化文件会被删除,导致无法恢复,建议手动备份或更改存储路径。通过以上方法,可以实现对 Servlet 容器事件的监听和响应,提升应用的功能和性能。
转载地址:http://gune.baihongyu.com/