09.《JavaEE 学习笔记》Listener监听器
2024-04-09 17:40:15  阅读数 577

1、6种监听事件类型

  • ServletContextEvent 上下文事件,当应用上下文对象发生改变,如创建或销毁上下文对象时,将触发上下文事件。
  • ServletContextAttributeEvent 上下文属性事件,当应用上下文的属性改变,如增加、删除、覆盖上下文中的属性时,将触发上下文属性事件。
  • ServletRequestEvent 请求事件,当请求对象发生改变,如创建或销毁请求对象时,触发请求事件。
  • ServletRequestAttributeEvent 请求属性事件,当请求中的属性改变,如增加、删除、覆盖请求中的属性时,触发请求属性事件。
  • HttpSessionEvent 会话事件,当会话对象发生改变,如创建或销毁会话对象,活化或钝化会话对象时,将触发会话事件。
  • HttpSessionBindingEvent 会话绑定事件,当会话中的属性发生变化时,如增加、删除、覆盖会话中的属性时,将触发会话绑定事件。

2、8种监听器接口

  • ServletContextListener 上下文监听器,监听ServletContextEvent事件。
  • ServletContextAttributeListener 上下文属性监听器,用来监听ServletContextAttribute事件。
  • ServletRequestListener 请求监听器,监听ServletRequestEvent事件。
  • ServletRequestAttributeListener 请求属性监听器,用来监听ServletRequestAttributeEvent事件。
  • HttpSessionListener 会话监听器,监听HttpSessionEvent。
  • HttpSessionActivationListener 会话活化监听器,监听HttpSessionEvent事件。
  • HttpSessionAttributeListener 会话属性监听器,监听HttpSessionAttributeEvent事件。
  • HttpSessionBindingListener 会话绑定监听器,监听HttpSessionAttributeEvent事件。

3. 利用监听器把前面的聊天室进行改进

上下文的创建与销毁监听器,记录聊天室的创建和解散

package com.company.project.listener;

import java.util.ArrayList;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.company.project.po.Message;

@WebListener
public class ServletContextListenerImpl implements ServletContextListener {
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
        System.out.println("聊天室已解散");
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
        System.out.println("聊天室创建成功");
        ArrayList<Message> messages = new ArrayList<>();
        ArrayList<String> userList = new ArrayList<>();
        sce.getServletContext().setAttribute("userList", userList);
        sce.getServletContext().setAttribute("messages", messages);
        
    }
}

会话的创建与销毁监听器,记录在线的用户。

package com.company.project.listener;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import com.company.project.po.Message;

@WebListener
public class HttpSessionListenerImpl implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        se.getSession().setMaxInactiveInterval(2);
        ServletContext servletContext = se.getSession().getServletContext();
        System.out.println("用户加入");
        ArrayList<Message> messages = (ArrayList<Message>) servletContext.getAttribute("messages");
        ArrayList<String> userList = (ArrayList<String>) servletContext.getAttribute("userList");
        String userId = se.getSession().getId();
        userList.add(userId);       
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        String sendTime = df.format(new Date());// new Date()为获取当前系统时间  
        Message message = new Message();
        message.setUserName("系统提示");
        message.setContent("欢迎"+userId+"加入");
        message.setSendTime(sendTime);
        messages.add(message);
        servletContext.setAttribute("userList", userList);
        servletContext.setAttribute("messages", messages);  
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext servletContext = se.getSession().getServletContext();
        System.out.println("用户退出");
        ArrayList<Message> messages = (ArrayList<Message>) servletContext.getAttribute("messages");
        ArrayList<String> userList = (ArrayList<String>) servletContext.getAttribute("userList");
        String userId = se.getSession().getId();
        userList.remove(userId);        
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        String sendTime = df.format(new Date());// new Date()为获取当前系统时间  
        Message message = new Message();
        message.setUserName("系统提示");
        message.setContent("用户"+userId+"已退出聊天室");
        message.setSendTime(sendTime);
        messages.add(message);  
        servletContext.setAttribute("userList", userList);
        servletContext.setAttribute("messages", messages);
    }
}