学习 java web 简单监听器

发布于:2025-08-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录结构

├── src\
│   └── com\
│       └── zhang\
│           ├── listener\
│           │   ├── MyListener.java
│           │   └── MyListener2.java
│           └── servlet\
│               └── ListenerServlet.java
└── web\
    ├── WEB-INF\
    │   └── web.xml
    ├── index.jsp
    └── main.jsp

技术栈

  • 后端 :Java Servlet + 监听器(Listener)
  • 前端 :JSP(JavaServer Pages)
  • 通过监听器实现应用启动/销毁时的资源管理
  • 通过Servlet处理HTTP请求
  • 使用JSP实现动态页面渲染

后端代码

package com.zhang.listener;

import javax.servlet.*;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.Date;


/**
 * 监听器
 *      监听作用域对象的创建和销毁以及属性的相关配置,可以添加一些属性配置,做逻辑判断
 *
 *      主要监听三种作用域
 *          ServletContext(application) session request
 *
 *          request
 *              接口:
 *                  ServletRequestListener:监听request对象的创建和销毁
 *                    public void requestDestroyed(ServletRequestEvent servletRequestEvent)  request对象销毁时添加的逻辑代码
 *                    public void requestInitialized(ServletRequestEvent servletRequestEvent)  request对象创建时添加的逻辑代码
 *                  ServletRequestAttributeListener:监听request作用域属性的添加,删除和更改
 *                     public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent)  属性添加时要做的事情
 *                     public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent)  属性删除时要做的事情
 *                     public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) 属性更改时要做的事情
 *           ServletContext:
 *                 接口:ServletContextListener  监听servletContext对象的创建和销毁
 *                  public void contextInitialized(ServletContextEvent servletContextEvent)创建对象,当启动tomcat服务器的时候创建
 *                  public void contextDestroyed(ServletContextEvent servletContextEvent)销毁对象,当关闭tomcat服务器的时候销毁
 *           ServletContext:
 *                 接口: ServletContextListener: 监听servletContext对象的属性的添加和删除和更改
 *                  public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent)添加属性
 *                  public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent)删除属性
 *                  public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent)修改属性
 *         session:
 *              接口: HttpSessionListener   监听session对象的创建和销毁
 *                  public void sessionCreated(HttpSessionEvent httpSessionEvent)session对象创建的时候执行
 *                  public void sessionDestroyed(HttpSessionEvent httpSessionEvent)session对象销毁的时候执行
 *              接口:HttpSessionAttributeListener  监听session对象的属性的添加和删除和更改
 *                   public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) 添加属性
 *                   public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) 删除属性
 *                   public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) 修改属性
 *属性的参数不同
 */
public class MyListener implements ServletRequestListener, ServletRequestAttributeListener, ServletContextListener,ServletContextAttributeListener, HttpSessionListener, HttpSessionAttributeListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("request对象被销毁"+new Date());

    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("request对象被创建"+new Date());
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("项目request作用域添加数据");
        System.out.println(servletRequestAttributeEvent.getName());
        System.out.println(servletRequestAttributeEvent.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("项目request作用域删除数据");
        System.out.println(servletRequestAttributeEvent.getName());
        System.out.println(servletRequestAttributeEvent.getValue());
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("项目request作用域属性替换");
        System.out.println(servletRequestAttributeEvent.getName());
        System.out.println(servletRequestAttributeEvent.getValue());
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext销毁");
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext添加属性");
        System.out.println(servletContextAttributeEvent.getName());
        System.out.println(servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext删除属性");
        System.out.println(servletContextAttributeEvent.getName());
        System.out.println(servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("ServletContext修改属性");
        System.out.println(servletContextAttributeEvent.getName());
        System.out.println(servletContextAttributeEvent.getValue());
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session对象被创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("session对象被销毁");

    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session添加属性");
        System.out.println(httpSessionBindingEvent.getName());
        System.out.println(httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session删除属性");
        System.out.println(httpSessionBindingEvent.getName());
        System.out.println(httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("session修改属性");
        System.out.println(httpSessionBindingEvent.getName());
        System.out.println(httpSessionBindingEvent.getValue());
    }
}



package com.zhang.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 监听访问次数
 */
public class MyListener2 implements HttpSessionListener, ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
//获取application
        ServletContext sc = servletContextEvent.getServletContext();
        //设置网站在线人数的初始值
        sc.setAttribute("count",0);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("servletContext被销毁");
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
//获取application
        ServletContext sc = httpSessionEvent.getSession().getServletContext();
        int count = (int)sc.getAttribute("count");
        sc.setAttribute("count",++count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
//获取application
        ServletContext sc = httpSessionEvent.getSession().getServletContext();
        int count = (int)sc.getAttribute("count");
        sc.setAttribute("count",--count);
    }
}




package com.zhang.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(name = "ListenerServlet")
public class ListenerServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");

        System.out.println("ListenerServlet逻辑处理");
//        request.setAttribute("listener","listener");
//        request.removeAttribute("listener");

        //向servletContext中添加属性
//        ServletContext sc = this.getServletContext();
//        sc.setAttribute("servletContext","servletContext--value");
        //向session作用域中添加属性
        HttpSession session = request.getSession();
        session.setAttribute("session","session--value");
        session.invalidate();//session默认三十分钟失效
        response.getWriter().write("listener study");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
    }
}

web

<?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-name>ListenerServlet</servlet-name>
<servlet-class>com.zhang.servlet.ListenerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ListenerServlet</servlet-name>
        <url-pattern>/listener</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>com.zhang.listener.MyListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.zhang.listener.MyListener2</listener-class>
    </listener>
</web-app>

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>



<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>main</title>
</head>
<body>
当前在线的人数是:${applicationScope.count}
</body>
</html>

用到的jar
jsp-api.jar
servlet-api.jar