[Java Web] 监听器

一、概述

监听器是Servlet规范中定义的一种特殊类,当时间发生时会自动触发相应的事件。

监听器主要用于监听ServletContext、HttpSession、ServletRequest等域对象的创建和销毁事件以及对象中属性发生修改的事件。

  • ServletContext的域对象是application。
  • HttpSession的域对象是session。
  • ServletRequest的域对象是request。

二、接口

根据监听对象分类

  • ServletContextListener、ServletContextAttributeListener
  • HttpSessionListener、HttpSessionAttributeListener
  • ServletRequestListener、ServletRequestAttributeListener

根据监听事件分类

  • HttpSessionListener、ServletContextListener、ServletRequestListener
  • HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener
  • HttpSessionBindingListener、HttpSessionActivationListener

三、代码实例

实现统计在线人数功能。

Servlet源代码。

//LoginServlet.java
package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String user = req.getParameter("user");
        HttpSession session = req.getSession();
        session.setAttribute("user", user);
        resp.sendRedirect("online.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}



//LogoutServlet.java
package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("user");
        resp.sendRedirect("index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
View Code

监听器源代码。

package listener;

import user.OnlineGroup;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineListener implements HttpSessionListener, HttpSessionAttributeListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println(String.format("session %s created!", se.getSession().getId()));
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println(String.format("session %s destroyed!", se.getSession().getId()));
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        String user = String.valueOf(se.getValue());
        OnlineGroup.add(user);
        System.out.println(String.format("session %s added %s: %s",
                se.getSession().getId(), se.getName(), se.getValue()));
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        String user = String.valueOf(se.getValue());
        OnlineGroup.remove(user);
        System.out.println(String.format("session %s removed %s: %s",
                se.getSession().getId(), se.getName(), se.getValue()));
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        String oldUser = String.valueOf(se.getValue());
        String newUser = String.valueOf(se.getSession().getAttribute(se.getName()));
        OnlineGroup.remove(oldUser);
        OnlineGroup.add(newUser);
        System.out.println(String.format("session %s replaced %s: %s",
                se.getSession().getId(), se.getName(), newUser));
    }
}
View Code

配置文件源代码。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置Servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>servlet.LogoutServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/logout</url-pattern>
    </servlet-mapping>

    <!--配置监听器-->
    <listener>
        <listener-class>listener.OnlineListener</listener-class>
    </listener>
</web-app>
View Code

猜你喜欢

转载自www.cnblogs.com/arseneyao/p/9346544.html