监听器与MVC
监听器的概述
监听器是Web应用程序事件模型的一部分:
监听许多信息的初始化、销毁、增加、修改、删除值等。
- Web应用中的某些状态发生改变时会产生相应的事件
- ServletContext、HttpSession、ServletRequest三个域对象引发的事件
- 域对象中的属性引发的事件
- 监听器可以接收这些事件,以便在事件发生时做出相关处理
使用监听器统计在线人数
实现在线用户统计的步骤:
-
创建类实现HttpSessionBindingListener接口
javax.servlet.http.HttpSessionBindingListener
-
在valueBound()和valueUnbound()方法中实现用户数量的统计
valueUnbound方法会在三种情况下自动调用:
- 调用使session失效的方法:session.invalidate()
- session超时
- 调用setAttribute重新设置了别的对象,或是调用removeAttribute移除了这个属性
valueBound(HttpSessionBindingEvent arg0) { //用户对象存入session时自动调用 //用户数量加1 } valueUnbound(HttpSessionBindingEvent arg0) { //用户对象从session中删除时自动调用 //用户数量减1 }
-
将其实例添加到session作用域
HttpSessionListen接口
▶HttpSessionListener
-
sessionCreated(HttpSessionEvent event)
-
sessionDestory(HttpSessionEvent event)
- 执行session.invalidate()方法
- session会话超时
-
在web.xml中配置监听器
<listener> <listener-class>监听器完全限定名</listener-class> </listener>
▶HttpSessionListener、HttpSessionBindingListener二者的区别:
-
HttpSessionListener(非感知型监听器):只需要设置到web.xml就可以监听整个应用中的所有session
-
HttpSessionBindingListener(感知型监听器):必须实例化后放入某一个session中,才能监听
-
监听范围:
-
HttpSessionListener设置一次就可以监听所有session
-
HttpSessionBindingListener通常是一对一
-
ServletContextListener接口
-
contextInitialized(ServletContextEvent arg)
-
contextDestroyed(ServletContextEvent arg)
监听器分类
根据三个域对象上的具体操作,将监听器划分为三类:
-
监听三个域对象的创建和销毁事件的监听器
-
监听域对象中属性的增加、删除、替换事件的监听器
-
监听绑定到HttpSession域中的某个对象的状态的监听器,又称为感知型监听器
常用监听器的接口:
监听器接口 | 说 明 |
---|---|
javax.servlet.ServletContextListener | 在Servlet上下文对象初始化或销毁时得到通知 |
javax.servlet.ServletRequestListener | 在请求对象初始化时或者被销毁时得到通知 |
javax.servlet.http.HttpSessionListener | 在session创建后或者失效前得到通知 |
javax.servlet.ServletContextAttributeListener | 在Servlet上下文中的属性列表发生变化时得到通知 |
javax.servlet.ServletRequestAttributeListener | 在请求对象中的属性列表发生变化时得到通知 |
javax.servlet.http.HttpSessionAttributeListener | 在session中的属性列表发生变化时得到通知 |
javax.servlet.http.HttpSessionActivationListener | 绑定到session中,当session被钝化或者激活时得到通知 |
javax.servlet.http.HttpSessionBindingListener | 在绑定session或从session中删除时会得到通知 |
MVC设计模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LxKDCGZ0-1665377144262)(F:\AAAAAAAANEW\Typora-user-images\1665224484967.png)]
优点:
多视图共享一个模型,大大提高代码的可重用性
MVC三个模块相互独立,松耦合架构
控制器提高了应用程序的灵活性和可配置性
有利于软件工程化管理
完美的系统框架 = 松耦合 + 高重用性 + 高扩展性
缺点:
原理复杂
增加了系统结构和实现的复杂性
视图对模型数据的低效率访问
在线人数累加思路叙述
-
在线人数累加是在用户登录的时候进行监听,使用HttpSessionBindingListener监听器
-
创建一个类设置静态变量,用于人数增加减少的变量
public class CountUsers { public static int COUNT_USER = 0; }
-
User实体类实现HttpSessionBindingListener监听器,方法的重写
//上线: @Override public void valueBound(HttpSessionBindingEvent event) { CountUsers.COUNT_USER ++; System.out.println("在线人数:"+CountUsers.COUNT_USER); } //下线: @Override public void valueUnbound(HttpSessionBindingEvent event) { CountUsers.COUNT_USER --; System.out.println("还在线人数:"+CountUsers.COUNT_USER); }
-
在LoginServlet中,可以设置session的获取与保存,还可以控制自动掉线观察人数的变化
//session作用域使每个页面都登录一次后都可以使用 HttpSession session = request.getSession(); session.setAttribute("user11", user); response.sendRedirect(request.getContextPath()+"/web/ProviderServlet"); session.setMaxInactiveInterval(10); //多长时间后重新登录 // System.out.println("在线人数:"+CountUsers.COUNT_USER);