J9_监听器与MVC

监听器与MVC

监听器的概述

监听器是Web应用程序事件模型的一部分:

监听许多信息的初始化、销毁、增加、修改、删除值等。

  • Web应用中的某些状态发生改变时会产生相应的事件
    • ServletContext、HttpSession、ServletRequest三个域对象引发的事件
    • 域对象中的属性引发的事件
  • 监听器可以接收这些事件,以便在事件发生时做出相关处理
使用监听器统计在线人数

实现在线用户统计的步骤:

  1. 创建类实现HttpSessionBindingListener接口

    javax.servlet.http.HttpSessionBindingListener
    
  2. 在valueBound()和valueUnbound()方法中实现用户数量的统计

    valueUnbound方法会在三种情况下自动调用:

    • 调用使session失效的方法:session.invalidate()
    • session超时
    • 调用setAttribute重新设置了别的对象,或是调用removeAttribute移除了这个属性
    valueBound(HttpSessionBindingEvent arg0) {
          //用户对象存入session时自动调用
          //用户数量加1
    }
    valueUnbound(HttpSessionBindingEvent arg0) {
          //用户对象从session中删除时自动调用
          //用户数量减1
    }
    
  3. 将其实例添加到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)

监听器分类

根据三个域对象上的具体操作,将监听器划分为三类:

  1. 监听三个域对象的创建和销毁事件的监听器

  2. 监听域对象中属性的增加、删除、替换事件的监听器

  3. 监听绑定到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三个模块相互独立,松耦合架构

​ 控制器提高了应用程序的灵活性和可配置性

​ 有利于软件工程化管理

完美的系统框架 = 松耦合 + 高重用性 + 高扩展性

缺点:

​ 原理复杂

​ 增加了系统结构和实现的复杂性

​ 视图对模型数据的低效率访问

在线人数累加思路叙述

  1. 在线人数累加是在用户登录的时候进行监听,使用HttpSessionBindingListener监听器

  2. 创建一个类设置静态变量,用于人数增加减少的变量

    public class CountUsers {
    	public static int COUNT_USER = 0;
    }
    
  3. 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);
    		
    	}
    
  4. 在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);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱尔斯Jules

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值