监听器

监听器是什么?

  监听器就是一个在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");

    }
}

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

posted @ 2019-06-29 11:55  Zs夏至  阅读(200)  评论(0编辑  收藏  举报