Java-servlet(完结篇)过滤器乱码解决与监听器

Java-servlet(完结篇)过滤器乱码解决与监听器

  • 前言
  • 一、过滤器乱码解决
  • 二、监听器
    • 1. HttpSessionListener
    • 2. ServletContextListener
    • 3. ServletRequestListener
  • 三、监听器的使用场景
  • Java-servlet 结语


前言

  • 在之前的 Java Servlet 学习中,我们已经熟悉了 Servlet 的基础配置、生命周期、请求响应处理,以及 Java Servlet 环境的配置,还学习了过滤器、请求调度程序和 Servlet 线程等知识
  • 今天,我们继续深入探讨过滤器和监听器,这两个在 Java Web 开发中极为重要的部分

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482


一、过滤器乱码解决

  • 在Web开发里,乱码问题常常让人头疼。
  • 不过,利用过滤器能有效解决这个问题。下面是一段解决乱码问题的过滤器代码:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("执行了过滤器-FilterDemo3");// 先让请求通过过滤器链,处理后续的过滤器或目标资源filterChain.doFilter(servletRequest, servletResponse);// 设置响应内容类型为HTML,字符编码为UTF-8servletResponse.setContentType("text/html;charset=utf-8");// 将ServletRequest强转为HttpServletRequest,方便后续操作HttpServletRequest request = (HttpServletRequest) servletRequest;// 再次通过过滤器链,保证请求和响应都得到完整处理filterChain.doFilter(servletRequest, servletResponse);
}
  • 这段代码的过滤器,先让请求在过滤器链中传递,然后设置响应编码为UTF - 8,避免响应内容出现乱码
  • 同时,再次调用过滤器链,确保整个请求和响应过程的完整性。

二、监听器

  • 监听器是Servlet规范里的重要组件,能监听Web应用中的各种事件,并在事件发生时执行相应操作。
  • 监听器有23种模式,下面介绍几种常用的监听器。

1. HttpSessionListener

用于监听HttpSession的创建和销毁事件。代码示例如下:

package javax.servlet.http;
import java.util.EventListener;
// HttpSessionListener继承自EventListener
public interface HttpSessionListener extends EventListener {// 当HttpSession创建时调用此方法void sessionCreated(HttpSessionEvent var1);// 当HttpSession销毁时调用此方法void sessionDestroyed(HttpSessionEvent var1);
}

使用时,要在web.xml文件中注册监听器:

<listener><listener-class>listener.MySessionListener</listener-class>
</listener>

然后实现自定义的监听器类MySessionListener:

package listener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements HttpSessionListener {// 当HttpSession创建时,打印日志@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("session Created");}// 当HttpSession销毁时,打印日志@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("session Destroyed");}// 这里额外重写一个处理属性添加的方法,虽然接口未定义,但可按需添加处理逻辑@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {System.out.println("attribute added");}
}

2. ServletContextListener

用于监听ServletContext的创建和销毁事件

  • ServletContext代表整个Web应用的上下文,通过它可以获取Web应用的初始化参数、共享资源等。示例代码如下:
package javax.servlet;
import java.util.EventListener;
public interface ServletContextListener extends EventListener {// 当ServletContext创建时调用此方法void contextInitialized(ServletContextEvent sce);// 当ServletContext销毁时调用此方法void contextDestroyed(ServletContextEvent sce);
}

在web.xml中注册:

<listener><listener-class>listener.MyServletContextListener</listener-class>
</listener>

实现自定义的监听器类:

package listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 在Web应用启动时执行的操作,比如初始化数据库连接池System.out.println("ServletContext初始化了");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 在Web应用关闭时执行的操作,比如关闭数据库连接池System.out.println("ServletContext销毁了");}
}

3. ServletRequestListener

用于监听ServletRequest的创建和销毁事件。

  • ServletRequest代表客户端的一次请求,通过监听它的生命周期,可以在请求处理前后进行一些通用操作。示例代码如下:
package javax.servlet;
import java.util.EventListener;
public interface ServletRequestListener extends EventListener {// 当ServletRequest创建时调用此方法void requestInitialized(ServletRequestEvent sre);// 当ServletRequest销毁时调用此方法void requestDestroyed(ServletRequestEvent sre);
}

在web.xml中注册:

<listener><listener-class>listener.MyServletRequestListener</listener-class>
</listener>

实现自定义的监听器类:

package listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {// 在请求开始处理时执行的操作,比如记录请求开始时间System.out.println("请求开始处理");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {// 在请求处理结束时执行的操作,比如记录请求处理时间System.out.println("请求处理结束");}
}

三、监听器的使用场景

  1. 统计在线用户数量:利用HttpSessionListener,在sessionCreated方法中让在线用户数加1,在sessionDestroyed方法中减1,从而实时统计在线用户数量。
  2. 记录用户登录和退出时间:在HttpSession创建时记录登录时间,销毁时记录退出时间,便于分析用户行为。
  3. 资源初始化和销毁:借助ServletContextListener,在Web应用启动时初始化全局资源,如数据库连接池;在应用关闭时释放资源,确保资源管理得当。
  4. 请求日志记录:通过ServletRequestListener,在请求开始和结束时记录日志,方便排查问题和监控系统运行状态。

Java-servlet 结语

  • 至此,Java Servlet 的入门讲解暂告一段落。通过这部分内容,我们已经搭建起 Web 开发的基础框架,理解了服务端与客户端交互的核心逻辑。

接下来,我们将深入探讨 JSP(Java 服务器页面)MySQL 数据库 的核心知识。

  • JSP 作为 Servlet 的延伸,能更便捷地实现动态页面渲染。

  • 而 MySQL 则是企业级应用中最常用的关系型数据库之一。

  • 三者结合(Servlet 处理请求逻辑、JSP 构建动态视图、MySQL 存储数据),将形成一套完整的 Web 后端开发体系——这正是支撑现代 Web 项目的“三板斧”

掌握这三项核心技术,不仅能为前端开发提供坚实的后端支持,更能让你在构建完整 Web 应用时游刃有余。无论是小型项目的快速落地,还是大型系统的架构设计,它们都是不可或缺的基石

后续课程中,我们将通过实战案例串联知识,帮助大家更好地理解和应用。

  • 期待与你继续探索,一起夯实 Web 开发的核心能力!

在这里插入图片描述
在这里插入图片描述


以上就是这篇博客的全部内容,接下来的博客里我们将陆续探索JSP与MySQL的更多精彩内容。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Java-servlet文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为了避免unboundLocalError和为什么X的值一直不变呢?

## 1.为了避免unboundLocalError 发生unboundLocalError&#xff01; def generate_integer(level):if level 1:X randint(1,9)return X这里出错的原因在于&#xff0c;一旦if 后面的条件没有成立&#xff0c;然后X根本没出生&#xff0c;然后你去使用它&#xff0c;这是有…

opencv-python基础

一.opencv-python简述 其使用Numpy&#xff0c;所有OpenCV数组结构都转换为Numpy数组&#xff0c;是一个高度优化的数据库操作库。 二.环境安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python 三.基本概念 - 像素是图像的基本单元&#xff0c;每个…

ReentrantLock 实现公平锁和非公平锁的原理!

&#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1f917;&#xff01; &#x1f31f;了解 ThreadLocal请看&#xff1a; ThreadLocal有趣讲解&#xff0c;小白也能听懂&#xff…

NLP高频面试题(四十一)——什么是 IA3 微调?

随着大型语言模型的广泛应用,如何高效地将这些模型适配到特定任务中,成为了研究和工程实践中的重要课题。IA3(Infused Adapter by Adding and Adjusting)微调技术,作为参数高效微调的一种新颖方法,提供了在保持模型性能的同时,显著减少可训练参数数量的解决方案。 IA3 …

swift菜鸟教程14(闭包)

一个朴实无华的目录 今日学习内容&#xff1a;1.Swift 闭包1.1闭包定义1.2闭包实例1.3闭包表达式1.3.1sorted 方法&#xff1a;据您提供的用于排序的闭包函数将已知类型数组中的值进行排序。1.3.2参数名称缩写&#xff1a;直接通过$0,$1,$2来顺序调用闭包的参数。1.3.3运算符函…

蓝桥杯-蓝桥幼儿园(Java-并查集)

并查集的核心思想 并查集主要由两个操作构成&#xff1a; Find&#xff1a;查找某个元素所在集合的根节点。并查集的特点是&#xff0c;每个元素都指向它自己的父节点&#xff0c;根节点的父节点指向它自己。查找过程中可以通过路径压缩来加速后续的查找操作&#xff0c;即将路…

ruby内置全局变量

以下是 Ruby 中常见的 内置全局变量 及其用途的详细说明。这些变量以 $ 开头&#xff0c;由 Ruby 解释器自动管理&#xff0c;用于访问系统状态、异常、输入输出等核心信息。 一、异常处理相关 全局变量说明示例$!当前作用域最后抛出的异常对象&#xff08;等同于 rescue >…

tcp转串口

windows 在 Windows 系统上&#xff0c;可以使用以下成熟的串口转 TCP 工具&#xff1a; HW VSP3 (HW Virtual Serial Port) 提供串口到 TCP/IP 的映射功能。支持虚拟串口和网络通信。下载地址&#xff1a;HW Group com0com com2tcp 开源工具&#xff0c;支持虚拟串口和 TCP…

HTML视频和音频

<video>元素 <video>元素用于在HTML文档中嵌入视频内容。 <video controls><source src"movie.mp4" type"video/mp4"><source src"movie.ogg" type"video/ogg">您的浏览器不支持 HTML5 video 标签。 …

DeepSeek:重构办公效率的AI新范式

目录 一、效率跃迁的三重引擎 二、效率提升的量级突破 三、智能办公的范式转移 四、未来办公的效率奇点 当企业主面对堆积如山的文件审批、跨时区协作的沟通损耗、重复机械的数据整理时&#xff0c;是否想过这些场景正在吞噬团队的生产力&#xff1f;据麦肯锡研究显示&…

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略&#xff0c;通常在高并发场景下使用。以下是其核心内容&#xff1a; 1. 问题背景 当更新数据库时&#xff0c;如果未及时删除或更新缓存&#xff0c;可能导致后续读请求仍从缓存中读取旧数据&#xff0c;造成数…

Python设计模式:策略模式

1. 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说&#xff0c;策略模式允许在运…

SpringBoot集成Ollama本地模型

SpringBoot集成Ollama本地模型 目录 项目准备创建Ollama服务客户端创建控制器配置应用属性创建前端界面添加静态资源支持完整项目结构启动应用高级功能扩展部署注意事项性能优化 1. 项目准备 创建一个SpringBoot项目&#xff0c;可以使用Spring Initializr或IDE创建添加必要…

ResNet改进(19):基于PyTorch的ResNet改进方案详解:Mish激活+SPP模块+MixUp数据增强

1. 前言 ResNet作为深度学习领域里程碑式的网络架构,在图像分类等计算机视觉任务中表现出色。然而,随着研究的深入和技术的发展,原始的ResNet架构仍有改进空间。本文将详细介绍一种基于PyTorch的ResNet改进方案,该方案融合了Mish激活函数、SPP模块和MixUp数据增强等先进技…

leetcode68.左右文本对齐

思路源自 leetcode-字符串篇 68题 文本左右对齐 难度高的模拟类型题目&#xff0c;关键点在于事先知道有多少单词要放在本行并且还要知道本行是不是最后一行&#xff08;最后一行需要全部单空格右对齐&#xff0c;不是最后一行就空格均摊&#xff09;&#xff0c;非最后一行的空…

深入理解 Spring 的 MethodParameter 类

MethodParameter 是 Spring 框架中一个非常重要的类&#xff0c;它封装了方法参数&#xff08;或返回类型&#xff09;的元数据信息。这个类在 Spring MVC、AOP、数据绑定等多个模块中都有广泛应用。 核心功能 MethodParameter 主要提供以下功能&#xff1a; 获取参数类型信息…

Qt 5.14.2入门(一)写个Hello Qt!程序

目录 参考链接&#xff1a;一、新建项目二、直接运行三、修改代码增加窗口内容1、Qt 显示一个 QLabel 标签控件窗口2、添加按键 参考链接&#xff1a; Qt5教程&#xff08;一&#xff09;&#xff1a;Hello World 程序 Qt 编程指南 一、新建项目 1、新建一个项目&#xff08…

Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值,以及 常用需要修改的配置项 的详细说明

以下是 Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值&#xff0c;以及 常用需要修改的配置项 的详细说明&#xff1a; 一、默认配置项及默认值 Spring Boot 对 MongoDB 的默认配置基于 spring.data.mongodb 前缀&#xff0c;以下是核心配置项&#xff1a; 配置项默认…

【QT】 进程

目录 QT 多进程复习 Linux-C 多进程QProcess 进程类常用方法简单示例信号与槽应用场景 跨平台注意事项技巧&#xff1a;使用宏控制平台命令 QProcess 在嵌入式系统中的使用示例&#xff1a;调用 ALSA 播放音频示例&#xff1a;调用 arecord 录音示例&#xff1a;QProcess Shel…

原子操作(cpp atomic)

目录 一.原子操作 1.原子操作的概念 2.原子变量 二.原子性 1.中间状态描述 2.单处理器单核 3.多处理器或多核的情况下 4.cache&#xff08;高速缓冲器的作用&#xff09; 5.在cpu cache基础上,cpu如何读写数据&#xff1f;&#xff1f;&#xff1f; 6.为什么会有缓存…