监听器

Posted zs-book1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监听器相关的知识,希望对你有一定的参考价值。

监听器是什么?

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

    

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

以上是关于监听器的主要内容,如果未能解决你的问题,请参考以下文章

监听器监听器使用

监听器Listener

Servlet监听器详解及举例

Listener监听器

监听器

监听器