zoukankan      html  css  js  c++  java
  • 监听器

    监听器是什么?

      监听器就是一个在j2EE中的一个接口

      监听器主要监听三大域对象(request、session、servletContext)

      监听内容:

        1.监听域对象的创建和销毁,也就是生命周期

        2.监听域对象的属性添加,更新,移除动作

        3.监听被加入域对象中的对象

       下面写监听器的用法,创建一个监听器:

    package com.zs.servlet;
    
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    
    public class ListenerDemo implements ServletContextListener,
            HttpSessionListener, HttpSessionAttributeListener {
    
        // Public constructor is required by servlet spec
        public ListenerDemo() {
        }
    
        /**
         * 初始化全局域对象,在tomcat被启动时执行,过滤器在后面被执行
         * @param sce
         */
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("初始化全局域对象");
        }
    
        /**
         * 销毁全局域对象
         * @param sce
         */
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("销毁全局与对象");
        }
    
        /**
         * 创建session对象
         * @param se
         */
        public void sessionCreated(HttpSessionEvent se) {
            System.out.println("创建session对象");
        }
    
        /**
         * 销毁session对象
         * @param se
         */
        public void sessionDestroyed(HttpSessionEvent se) {
            System.out.println("销毁session对象");
        }
    
        /**
         * 添加共享数据
         * @param sbe
         */
        public void attributeAdded(HttpSessionBindingEvent sbe) {
            System.out.println("添加了一个共享数据");
        }
    
        /**
         * 移除了共享数据
         * @param sbe
         */
        public void attributeRemoved(HttpSessionBindingEvent sbe) {
            System.out.println("移除了一个共享数据");
        }
    
        /**
         * 替换共享数据
         * @param sbe
         */
        public void attributeReplaced(HttpSessionBindingEvent sbe) {
            System.out.println("共享数据被替换了");
        }
    }

    然后在创建servlet,并调用方法

    package com.zs.servlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    @WebServlet("/login")
    public class ServletDemo extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            String password = req.getParameter("password");
    
            HttpSession session = req.getSession();//创建session对象
            session.setAttribute("user", username);//添加共享数据
    
            session.setAttribute("user","张三");//替换共享数据中的数据
            session.removeAttribute("user");//移除共享数据
    
            resp.sendRedirect("index.jsp");
        }
    }

    运行结果如下:

    是在上一篇的项目基础上写的,所以显示了过滤器内的内容。

    下面实现在线人数的统计功能。

    要想实现统计在线人数,那么就要用到全局域对象,这里通过监听器来获取在线人数

    package com.zs.servlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.*;
    
    public class ListenerDemo implements ServletContextListener,
            HttpSessionListener, HttpSessionAttributeListener {
    
    
        public ListenerDemo() {
        }
    
        /**
         * 初始化全局域对象,在tomcat被启动时执行,过滤器在后面被执行
         * @param sce
         */
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("初始化全局域对象");
        }
    
        /**
         * 销毁全局域对象
         * @param sce
         */
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("销毁全局与对象");
        }
    
        /**
         * 创建session对象
         * @param se
         */
        public void sessionCreated(HttpSessionEvent se) {
            System.out.println("创建session对象");
        }
    
        /**
         * 销毁session对象
         * @param se
         */
        public void sessionDestroyed(HttpSessionEvent se) {
            System.out.println("销毁session对象");
        }
    
        /**
         * 添加共享数据
         * @param sbe
         */
        public void attributeAdded(HttpSessionBindingEvent sbe) {
            /**
             * 当添加一个共享数据(user)的时候,就表示有一个用户登陆了,在线人数就+1
             */
    
            HttpSession session = sbe.getSession();//获取session对象
            ServletContext servletContext = session.getServletContext();//获取全局域对象
            Object user = session.getAttribute("user");
            if (user != null) {
                Integer count = (Integer) servletContext.getAttribute("count");
                if (count == null) {
                    count=0;
                }
                count++;
                servletContext.setAttribute("count", count);
            }
        }
    
        /**
         * 移除了共享数据
         * @param sbe
         */
        public void attributeRemoved(HttpSessionBindingEvent sbe) {
            Integer count = (Integer) sbe.getSession().getServletContext().getAttribute("count");
            count--;
            sbe.getSession().getServletContext().setAttribute("count", count);
        }
    
        /**
         * 替换共享数据
         * @param sbe
         */
        public void attributeReplaced(HttpSessionBindingEvent sbe) {
            System.out.println("共享数据被替换了");
        }
    }

    index页面为:

    退出系统servlet为:

    package com.zs.servlet;
    
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/exit")
    public class ExitServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.getSession().removeAttribute("user");
    
            resp.sendRedirect("index.jsp");
    
        }
    }

    打开两个浏览器,分别登录注销测试。

  • 相关阅读:
    0 RabbitMQ概念
    java 排序
    spring整合redis(基于redisTemplate)
    http之content-type
    http协议讲解
    Java8 lambda 以及 Lambda在集合中的使用
    java中decimalFormat格式化数值
    找出占用的端口进程ID,并且杀死该进程
    CSS
    标签
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/11106170.html
Copyright © 2011-2022 走看看