Listener监听器
-
什么是Listener监听器?
- 监听器是Servlet规范中的一员
-
为什么要有监听器?
- 监听器实质上是Servlet规范留给web程序的特殊时机
- 如果特殊时段想使用某段代码,就需要用到监听器
-
Servlet规范中提供了哪些监听器对象?
- jakarta.servlet包下:
- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
- jakarta.servlet.http包下:
- HttpSessionListener
- 监听session对象的创建和销毁
- HttpSessionAttributeListener
- 监听session会话域是否绑定了数据
- HttpSessionBindingListener
- 监听数据是否被绑定到会话域
- HttpSessionIdListener
- 监听session对象的ID发生改变
- HttpSessionActivationListener
- 监听session对象的钝化和活化
- 钝化session对象存储到硬盘中
- 活化session对象恢复到内存中
- 监听session对象的钝化和活化
- HttpSessionListener
- jakarta.servlet包下:
-
监听器对象怎么使用?以ServletContextListener为例。
-
第一步:写一个类实现ServletContextListener,并实现其方法
-
public class Listener01 implements ServletContextListener { //该方法再servletContext对象被创建时调用 @Override public void contextInitialized(ServletContextEvent sce) { } //该方法再servletContext对象被销毁时调用 @Override public void contextDestroyed(ServletContextEvent sce) { ServletContextListener.super.contextDestroyed(sce); } }
-
-
再web.xml文件中配置(当然也可以使用注解)
-
<listener> <listener-class>com.web.listener.Listener01</listener-class> </listener> @WebListener
-
-
需要注意:所有监听器中的方法都不需要程序员来调用,由服务器调用
- 当某个特殊事件触发时,被服务器调用
-
-
监听器的业务场景:(实现统计OA项目的在线人数)
-
实时统计网站在线人数。服务器每分配一个session则代表一个用户访问,只要session对象新建,则count++将count存储在ServlerContext应用域中(不够精确)
- 使用HttpSessionListener来统计用户人数
-
统计登陆用户的在线人数,使用HttpSessionAttributeListener(只要session存储了user则代表用户登陆成功)
-
统计登陆的用户人数,使用HttpSessionBindingListener(只有user被添加到session中代表登陆成功)
-
//写一个用户类实现HttpSessionBindingListener //当这个类被添加到session中时即触发一次count++ public class User implements HttpSessionBindingListener { private String username; private String password; @Override public void valueBound(HttpSessionBindingEvent event) { //用户登录 //获取应用域 ServletContext application = event.getSession().getServletContext(); Integer countOnline = (Integer)application.getAttribute("countOnline"); if(countOnline==null){ application.setAttribute("countOnline",1); }else { countOnline++; application.setAttribute("countOnline",countOnline); } } @Override public void valueUnbound(HttpSessionBindingEvent event) { //用户退出 ServletContext application = event.getSession().getServletContext(); Integer countOnline = (Integer) application.getAttribute("countOnline"); countOnline--; application.setAttribute("countOnline",countOnline); } public User() { } public User(String username, String password) { this.username = username; this.password = password; } }
//登陆 User user = new User(username,password); session.setAttribute("user",user); //退出 session.removeAttribute("user");
-
-