一. 过滤器(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等。这些监听器提供了一些通用的解决方案,可用于应用程序中常见的场景,如应用程序的初始化、请求的处理、会话管理等。通过使用这些通用的监听器,开发者可以以更加快速和方便的方式完成常见功能的实现。