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

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开发里,乱码问题常常让人头疼。
  • 不过,利用过滤器能有效解决这个问题。下面是一段解决乱码问题的过滤器代码:
java 复制代码
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("执行了过滤器-FilterDemo3");
    // 先让请求通过过滤器链,处理后续的过滤器或目标资源
    filterChain.doFilter(servletRequest, servletResponse);
    // 设置响应内容类型为HTML,字符编码为UTF-8
    servletResponse.setContentType("text/html;charset=utf-8");

    // 将ServletRequest强转为HttpServletRequest,方便后续操作
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    // 再次通过过滤器链,保证请求和响应都得到完整处理
    filterChain.doFilter(servletRequest, servletResponse);
}
  • 这段代码的过滤器,先让请求在过滤器链中传递,然后设置响应编码为UTF - 8,避免响应内容出现乱码。
  • 同时,再次调用过滤器链,确保整个请求和响应过程的完整性。

二、监听器

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

1. HttpSessionListener

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

java 复制代码
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文件中注册监听器:

xml 复制代码
<listener>
    <listener-class>listener.MySessionListener</listener-class>
</listener>

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

java 复制代码
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创建时,打印日志
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("session Created");
    }
    // 当HttpSession销毁时,打印日志
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("session Destroyed");
    }
    // 这里额外重写一个处理属性添加的方法,虽然接口未定义,但可按需添加处理逻辑
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("attribute added");
    }
}

2. ServletContextListener

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

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

在web.xml中注册:

xml 复制代码
<listener>
    <listener-class>listener.MyServletContextListener</listener-class>
</listener>

实现自定义的监听器类:

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

3. ServletRequestListener

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

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

在web.xml中注册:

xml 复制代码
<listener>
    <listener-class>listener.MyServletRequestListener</listener-class>
</listener>

实现自定义的监听器类:

java 复制代码
package listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyServletRequestListener implements ServletRequestListener {
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        // 在请求开始处理时执行的操作,比如记录请求开始时间
        System.out.println("请求开始处理");
    }
    @Override
    public 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

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

相关推荐
EnCi Zheng7 分钟前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端
烙印60112 分钟前
Spring容器的心脏:深度解析refresh()方法(上)
java·后端·spring
为什么我不是源代码15 分钟前
JPA读取数据库离谱问题-No property ‘selectClassByName‘ found-Not a managed type
java·sql
Lisonseekpan28 分钟前
Guava Cache 高性能本地缓存库详解与使用案例
java·spring boot·后端·缓存·guava
我真的是大笨蛋38 分钟前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存
心态特好1 小时前
Jwt非对称加密的应用场景
java
七七七七071 小时前
【Linux 系统】打开文件和文件系统
linux·运维·spring
敢敢J的憨憨L1 小时前
GPTL(General Purpose Timing Library)使用教程
java·服务器·前端·c++·轻量级计时工具库
sg_knight2 小时前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
ManageEngineITSM2 小时前
IT 服务自动化的时代:让效率与体验共进
运维·数据库·人工智能·自动化·itsm·工单系统