第六章 过滤器与监听器

一. 过滤器(Filter)

1.过滤器概念

是向Web应用程序的请求和响应添加功能的Web服务组件

过滤器可以统一地集中处理请求和响应

使用过滤器技术实现对请求数据的过滤

在Web中的过滤器,就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊功能。

 2.创建过滤器

在web.xml中配置过滤器或者注释方式

//在web.xml中配置过滤器
<filter>
    <filter-name>过滤器名</filter-name>
    <filter-class>过滤器的完全限定名</filter-class>
</filter>
<filter-mapping>
    <filter-name>过滤器名</filter-name>
    <url-pattern>过滤器映射的Web资源</url-pattern>
</filter-mapping>
//注释
@WebFilter("/api/*")
public class CharacterEncodingFilter implements Filter {
  @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

      
    }

 }

配置过滤器的初始化参数

//配置<init-param>元素
<filter>
<init-param>
    <param-name>Encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>

创建过滤器

public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化CharacterEncodingFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        //解决中文乱码
        servletRequest.setCharacterEncoding("utf-8");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

3.过滤器的生命周期

生命周期谁来做何时做
实例化Servlet 容器当Servlet容器启动或者容器检测到客户端请求时
初始化Servlet 容器实例化后,容器调用Servlet的init()初始化对象
处理请求Servlet 容器得到客户端请求并做出处理时
销毁Servlet 容器当程序中的Servlet对象不再使用的时候,或者Web服务器停止运行的时候
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @Author: LNH
 * @Date: 2024-09-10-9:41
 * @Description:
 */
@WebFilter("/api/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化CharacterEncodingFilter");
    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        //解决中文乱码
        servletRequest.setCharacterEncoding("utf-8");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("销毁CharacterEncodingFilter");
    }
}

二. 监听器(Listener)

1.监听器

1.Listener 监听器它是 JavaWeb 的三大组件之一。 JavaWeb 的三大组件分别是: Servlet 程序、 Listener 监听器、Filter 过滤器。

2.Listener 是 JavaEE 的规范,就是接口。

3.监听器的作用是,监听某种变化 ( 一般就是对象创建/销毁 , 属性变化 ), 触发对应方法完成相应的任务。

4.JavaWeb 中的监听器(共八个) , 目前最常用的是 ServletContextListener。

 

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

/**
 * @Author: LNH
 * @Date: 2024-09-10-10:10
 * @Description:
 */
@WebListener
public class IndexListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("监听器创建");
        
        ServletContext application = event.getSession().getServletContext();
        Integer  userCount = (Integer) application.getAttribute("userCount");

        if (userCount==null){
            userCount = 1;
        }else {
            userCount ++;

        }
        System.out.println("当前登录人数:"+userCount);
        //存入共享数据
        application.setAttribute("userCount",userCount);

    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.println("监听器销毁");
    }
}

2. 监听器的方法

监听器(Listener)在JavaWeb应用程序中起到监听和处理事件的作用。监听器的生命周期与Web应用程序的生命周期密切相关。

ServletContextListener:

ServletContextListener会在Web应用程序启动时起作用,并在Web应用程序关闭时销毁。

ServletRequestListener:

ServletRequestListener会在每次客户端请求到达服务器时起作用,并在服务器响应完成后销毁。

HttpSessionListener:

HttpSessionListener会在每次HttpSession创建和销毁时起作用。

注意:监听器是通过在web.xml配置文件中声明来启用的。开发者需要在web.xml文件中添加相应的监听器声明,告诉Web容器要监听哪些事件,并指定相应的监听器类。

3. 常见的监听器

Listener(监听器)可以监听不同的事件,具体监听的事件类型取决于监听器的种类。

ServletContextListener:

监听ServletContext对象的创建和销毁事件,当Web应用程序启动和关闭时触发。

ServletRequestListener:

监听ServletRequest对象的创建和销毁事件,在每次客户端请求到达服务器时触发。

HttpSessionListener:

监听HttpSession对象的创建和销毁事件,当用户与Web应用程序建立和关闭会话时触发。

ServletContextAttributeListener:

监听ServletContext中属性的添加、修改和删除事件。

ServletRequestAttributeListener:

监听ServletRequest中属性的添加、修改和删除事件。

HttpSessionAttributeListener:

监听HttpSession中属性的添加、修改和删除事件。

HttpSessionActivationListener:

监听HttpSession对象的钝化(passivation)和活化(activation)事件,与分布式会话(Distributed Session)有关。

ServletRequestListener:

监听ServletContext对象的创建和销毁事件,以及请求的开始和完成。

ServletContextListener:

监听ServletContext对象的创建和销毁事件,与Web应用程序的启动和关闭有关。

4.监听器的作用

实现事件驱动编程:

监听器的核心概念是基于事件的触发和响应,它使得开发者可以将应用程序的关键行为和状态抽象成事件,并在事件发生时执行相应的逻辑处理。通过监听器,开发者可以实现事件驱动编程的思想,更加灵活地响应应用程序中的各种事件。

解耦和模块化:

监听器解耦了应用程序中不同模块之间的依赖关系。它提供了一种松耦合的方式来将事件和事件处理的逻辑相互分离,使得不同的模块可以独立地进行开发和维护。通过监听器,开发者可以将特定事件的处理逻辑集中到监听器中,从而提高代码的可读性和可维护性。

增强可扩展性:

使用监听器可以有效地增强应用程序的可扩展性。当应用程序需要添加新的功能或处理新的事件时,可以通过编写自定义的监听器来实现。通过监听器,可以在不修改已有代码的情况下,将新的功能集成到应用程序中,从而实现应用程序的动态扩展。

提供通用的解决方案:

一些监听器是Web容器预先定义的,如ServletContextListener、ServletRequestListener和HttpSessionListener等。这些监听器提供了一些通用的解决方案,可用于应用程序中常见的场景,如应用程序的初始化、请求的处理、会话管理等。通过使用这些通用的监听器,开发者可以以更加快速和方便的方式完成常见功能的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值