监听器是Web应用程序事件模型的一部分:
监听许多信息的初始化、销毁、增加、修改、删除值等。
实现在线用户统计的步骤:
创建类实现HttpSessionBindingListener接口
javax.servlet.http.HttpSessionBindingListener
在valueBound()和valueUnbound()方法中实现用户数量的统计
valueUnbound方法会在三种情况下自动调用:
valueBound(HttpSessionBindingEvent arg0) {
//用户对象存入session时自动调用
//用户数量加1
}
valueUnbound(HttpSessionBindingEvent arg0) {
//用户对象从session中删除时自动调用
//用户数量减1
}
将其实例添加到session作用域
▶HttpSessionListener
sessionCreated(HttpSessionEvent event)
sessionDestory(HttpSessionEvent event)
在web.xml中配置监听器
<listener>
<listener-class>监听器完全限定名</listener-class>
</listener>
▶HttpSessionListener、HttpSessionBindingListener二者的区别:
HttpSessionListener(非感知型监听器):只需要设置到web.xml就可以监听整个应用中的所有session
HttpSessionBindingListener(感知型监听器):必须实例化后放入某一个session中,才能监听
监听范围:
HttpSessionListener设置一次就可以监听所有session
HttpSessionBindingListener通常是一对一
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中删除时会得到通知 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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);