首页 > 其他分享 >Listener

Listener

时间:2022-12-23 22:11:09浏览次数:36  
标签:countOnline Listener application session user 监听器 public

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对象恢复到内存中
  • 监听器对象怎么使用?以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");
        

标签:countOnline,Listener,application,session,user,监听器,public
From: https://www.cnblogs.com/RepublicLine/p/17001652.html

相关文章