Java学习----Servlet 中的监听器

        在 Java Web 开发的世界里,Servlet 技术犹如基石,支撑着众多 Web 应用的运行。而在 Servlet 的技术体系中,监听器(Listener)是一个看似低调却至关重要的组件。它默默监听着 Servlet 容器中的各种事件,在恰当的时刻发挥作用,为 Web 应用的稳定运行保驾护航。下面,就让我们一同深入了解 Servlet 监听器。​

        Servlet 监听器是用于监听 Servlet 容器中各种事件的组件。简单来说,它就像一个 “哨兵”,时刻关注着容器内特定事件的发生,当这些事件出现时,监听器会立即触发相应的处理方法。​它能够监听的事件种类颇为丰富,涵盖了应用程序的启动和关闭、用户会话的创建和销毁、请求的发起和结束等多个方面。有了监听器,开发人员可以在这些关键事件发生时,执行预先设定好的操作,从而更好地掌控 Web 应用的运行流程。​

        Servlet 监听器的工作原理并不复杂,其核心在于接口的实现。它通过实现不同的监听器接口,来针对性地监听对应的事件。​在 Servlet 规范中,定义了一系列监听器接口,常见的有ServletContextListener、ServletRequestListener、HttpSessionListener等。当 Servlet 容器中发生相应的事件时,容器会自动调用监听器中对应的方法。​例如,ServletContextListener专门用于监听 Servlet 上下文(ServletContext)的创建和销毁事件。当 Web 应用启动时,容器会创建ServletContext对象,此时就会调用ServletContextListener的contextInitialized方法;而当 Web 应用关闭时,容器销毁ServletContext对象,contextDestroyed方法则会被调用。​再如HttpSessionListener,它负责监听用户会话(HttpSession)的创建与销毁。当一个新的用户会话建立时,sessionCreated方法会被触发;当会话结束时,sessionDestroyed方法便会执行。​

        监听器在 Web 应用中发挥着多方面的重要作用,具体如下:​

(1)初始化资源:在 Web 应用启动时,通过ServletContextListener可以初始化一些全局的资源。比如创建数据库连接池,将常用的配置信息加载到内存中,为应用的后续运行做好准备。这样,在应用运行过程中,就可以直接使用这些预先初始化好的资源,提高运行效率。​

(2)释放资源:天下没有不散的筵席,Web 应用也有关闭的时候。在应用关闭时,同样可以借助ServletContextListener释放之前初始化的资源,像关闭数据库连接池,避免资源的浪费和泄露。​

(3)统计在线用户数量:这是监听器一个非常实用的功能。通过HttpSessionListener监听会话的创建和销毁,能够轻松统计当前在线的用户数量。每当有新用户访问应用创建会话时,在线用户数加 1;当用户退出或会话超时销毁时,在线用户数减 1。​

(4)记录请求信息:利用ServletRequestListener可以监听请求的创建和销毁。开发人员可以借此记录请求的相关信息,如请求的 URL、客户端的 IP 地址、请求处理的时间等,这些信息对于系统的监控、调试和优化都大有裨益。​

       监听器的优点​主要有:

(1)实时响应容器事件:监听器能够敏锐地捕捉到 Servlet 容器中发生的各种事件,并在第一时间做出响应,执行相应的处理逻辑,保证了对事件处理的及时性。​

(2)便于进行资源管理:借助监听器,开发人员可以在应用程序启动和关闭这两个关键节点,对资源进行统一的初始化和释放管理,提高了资源的使用效率,也让资源管理更加规范。​

(3)不侵入业务代码:监听器的逻辑与业务逻辑相互分离,它独立于业务代码运行,不会对业务代码的实现造成干扰,符合软件设计中低耦合的原则。​

        但其也有一些缺点,如:​

(1)可能会影响容器性能:如果应用中配置了过多的监听器,会增加容器的负担。因为容器需要时刻关注这些监听器所监听的事件,频繁地触发和执行处理方法,从而影响容器的运行性能。​

(2)调试相对困难:监听器的触发是由容器自动控制的,它不像普通的方法可以通过显式调用进行调试。当监听器出现问题时,很难追踪到具体的触发场景和执行过程,给调试工作带来一定的难度。​

(3)功能相对单一:监听器的主要职责就是监听事件并做出简单响应,对于复杂的业务处理,它往往力不从心,需要与其他组件配合才能完成。​

        下面通过两个具体的代码示例,来进一步理解监听器的实现和应用。​

        示例一:监听 ServletContext 的创建和销毁​

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

// 使用@WebListener注解将该类标识为监听器
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 当ServletContext创建时调用,即Web应用启动时
        System.out.println("Web应用启动,开始初始化资源");
        // 模拟初始化数据库连接池
        // DataSource dataSource = new DataSource();
        // 将初始化的资源存储到ServletContext中,供整个应用使用
        // sce.getServletContext().setAttribute("dataSource", dataSource);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 当ServletContext销毁时调用,即Web应用关闭时
        System.out.println("Web应用关闭,开始释放资源");
        // 模拟释放数据库连接池
        // DataSource dataSource = (DataSource) sce.getServletContext().getAttribute("dataSource");
        // dataSource.close();
    }
}

        在这个示例中,MyServletContextListener类实现了ServletContextListener接口。通过@WebListener注解,告知容器这是一个监听器。​当 Web 应用启动时,contextInitialized方法被调用,在这里可以进行资源的初始化操作,比如创建数据库连接池,并将其存储到ServletContext中,以便整个应用共享使用。​当 Web 应用关闭时,contextDestroyed方法执行,用于释放之前初始化的资源,如关闭数据库连接池,确保资源不被浪费。​

        示例二:监听 HttpSession 的创建和销毁以统计在线用户​

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

@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
    private int onlineUserCount = 0;

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 当会话创建时调用
        onlineUserCount++;
        System.out.println("有新用户上线,当前在线人数:" + onlineUserCount);
        // 将在线人数存储到ServletContext中,方便页面展示
        se.getSession().getServletContext().setAttribute("onlineUserCount", onlineUserCount);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // 当会话销毁时调用
        onlineUserCount--;
        System.out.println("有用户下线,当前在线人数:" + onlineUserCount);
        se.getSession().getServletContext().setAttribute("onlineUserCount", onlineUserCount);
    }
}

        这个示例中的MyHttpSessionListener实现了HttpSessionListener接口,用于监听用户会话的创建和销毁。​类中定义了onlineUserCount变量来记录在线用户数量。当有新用户访问应用,创建会话时,sessionCreated方法被调用,onlineUserCount加 1,并将最新的在线人数存储到ServletContext中,这样在页面上就可以实时显示在线人数。​当用户退出应用或会话超时导致会话销毁时,sessionDestroyed方法执行,onlineUserCount减 1,同样更新ServletContext中的在线人数数据。​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值