Servlet 三大组件详解

2025-12-12 0 298

Servlet 三大组件详解

Servlet 三大组件是指 Servlet、Filter(过滤器)和 Listener(监听器),它们是 Java Web 应用开发的核心基础组件,各自承担着不同的职责。下面将详细介绍这三大组件的概念、生命周期、用法和应用场景。

一、Servlet

1. 基本概念

Servlet 是运行在服务器端的 Java 程序,用于处理客户端请求并生成响应。它是连接客户端和服务器端业务逻辑的桥梁,是实现动态网页的核心技术。

2. 主要作用

  • 接收请求:解析客户端发送的 HTTP 请求
  • 处理请求:执行业务逻辑处理
  • 返回响应:生成 HTTP 响应并返回给客户端

3. 生命周期

Servlet 的生命周期分为以下几个阶段:

  1. 实例化:当第一次请求 Servlet 时,Web 容器创建 Servlet 实例(单例模式)
  2. 初始化:容器调用 init() 方法,只执行一次,用于初始化资源
  3. 服务:每次请求都会调用 service() 方法,根据请求类型分发到 doGet()doPost() 等方法
  4. 销毁:服务器关闭或应用卸载时,容器调用 destroy() 方法,释放资源

4. 代码示例

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

// 使用注解配置
@WebServlet(\"/hello\")
public class HelloServlet extends HttpServlet {
    
    // 构造器,只调用一次
    public HelloServlet() {
        System.out.println(\"1. Servlet构造器被调用\");
    }
    
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println(\"2. Servlet初始化\");
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(\"text/html;charset=UTF-8\");
        PrintWriter out = response.getWriter();
        out.println(\"

Hello Servlet!

\"
); System.out.println(\"3. 处理GET请求\"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理POST请求 System.out.println(\"3. 处理POST请求\"); } @Override public void destroy() { System.out.println(\"4. Servlet销毁\"); } }

5. 配置方式

注解方式(Servlet 3.0+)
@WebServlet(
    name = \"HelloServlet\",
    urlPatterns = \"/hello\",
    loadOnStartup = 1 // 服务器启动时加载
)
XML 配置方式
<servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

二、Filter(过滤器)

1. 基本概念

Filter 是在客户端和服务器之间的一个过滤层,用于拦截客户端的请求和服务器的响应,实现对请求和响应的预处理和后处理。

2. 主要作用

  • 身份验证:登录验证、权限检查
  • 数据过滤:敏感词过滤、XSS 防护
  • 字符编码处理:统一设置请求和响应的字符编码
  • 日志记录:记录请求信息
  • 响应内容修改:在响应返回客户端前修改内容

3. 生命周期

Filter 的生命周期分为以下几个阶段:

  1. 初始化:服务器启动时,容器创建 Filter 实例并调用 init() 方法,只执行一次
  2. 过滤:每次请求被拦截时,容器调用 doFilter() 方法
  3. 销毁:服务器关闭时,容器调用 destroy() 方法,释放资源

4. 代码示例

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter(\"/*\")  // 拦截所有请求
public class EncodingFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(\"1. Filter初始化\");
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println(\"2. 执行过滤前的处理\");
        
        // 设置请求和响应的字符编码
        request.setCharacterEncoding(\"UTF-8\");
        response.setCharacterEncoding(\"UTF-8\");
        response.setContentType(\"text/html;charset=UTF-8\");
        
        // 放行请求,让请求继续向下执行
        chain.doFilter(request, response);
        
        System.out.println(\"4. 执行过滤后的处理\");
    }
    
    @Override
    public void destroy() {
        System.out.println(\"5. Filter销毁\");
    }
}

5. 配置方式

注解方式
@WebFilter(
    filterName = \"EncodingFilter\",
    urlPatterns = {\"/*\"},  // 拦截所有请求
    initParams = {
        @WebInitParam(name = \"encoding\", value = \"UTF-8\")
    }
)
XML 配置方式
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>com.example.EncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6. 过滤器链

多个过滤器可以组成过滤器链,请求会依次经过每个过滤器。过滤器的执行顺序:

  • XML 配置:按照 标签的顺序执行
  • 注解配置:按照类名的字母顺序执行

三、Listener(监听器)

1. 基本概念

Listener 是用于监听 Web 应用中的事件并触发相应处理的组件。它可以监听 Web 应用的生命周期、Session 的创建和销毁、属性的变化等。

2. 主要类型

ServletContext 监听器
  • ServletContextListener:监听 ServletContext 的创建和销毁
  • ServletContextAttributeListener:监听 ServletContext 属性的变化
HttpSession 监听器
  • HttpSessionListener:监听 Session 的创建和销毁
  • HttpSessionAttributeListener:监听 Session 属性的变化
  • HttpSessionBindingListener:监听对象绑定到 Session 或从 Session 解绑
  • HttpSessionActivationListener:监听 Session 的活化和钝化
ServletRequest 监听器
  • ServletRequestListener:监听请求的创建和销毁
  • ServletRequestAttributeListener:监听请求属性的变化

3. 生命周期

ServletContextListener 为例:

  1. 上下文初始化:Web 应用启动时,调用 contextInitialized() 方法
  2. 上下文销毁:Web 应用关闭时,调用 contextDestroyed() 方法

4. 代码示例

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

@WebListener
public class AppListener implements ServletContextListener {
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println(\"1. Web应用启动,初始化上下文\");
        // 可以在这里加载配置文件、初始化数据库连接池等
    }
    
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println(\"2. Web应用关闭,销毁上下文\");
        // 可以在这里释放资源,如关闭数据库连接池等
    }
}

5. 配置方式

注解方式
@WebListener
XML 配置方式
<listener>
    <listener-class>com.example.AppListener</listener-class>
</listener>

四、三大组件的调用顺序

在一个完整的请求处理流程中,三大组件的调用顺序如下:

  1. 服务器启动阶段

    • Listener(ServletContextListener)→ Filter → Servlet(如果配置了 load-on-startup)
  2. 请求处理阶段

    • Listener(ServletRequestListener)→ Filter(多个按顺序)→ Servlet → Filter(反向顺序)→ Listener
  3. 服务器关闭阶段

    • Servlet → Filter → Listener(ServletContextListener)

五、在 SpringBoot 中使用三大组件

在 SpringBoot 中使用 Servlet 三大组件需要进行额外配置:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {
    
    // 注册 Servlet
    @Bean
    public ServletRegistrationBean helloServletRegistrationBean() {
        ServletRegistrationBean registrationBean = 
            new ServletRegistrationBean(new HelloServlet(), \"/hello\");
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }
    
    // 注册 Filter
    @Bean
    public FilterRegistrationBean encodingFilterRegistrationBean() {
        FilterRegistrationBean registrationBean = 
            new FilterRegistrationBean(new EncodingFilter());
        registrationBean.addUrlPatterns(\"/*\");
        return registrationBean;
    }
    
    // 注册 Listener
    @Bean
    public ServletListenerRegistrationBean appListenerRegistrationBean() {
        return new ServletListenerRegistrationBean(new AppListener());
    }
}

六、应用场景总结

组件 主要职责 典型应用场景
Servlet 处理请求,生成响应 用户登录、数据查询、业务处理
Filter 过滤请求和响应 登录验证、字符编码处理、敏感词过滤、日志记录
Listener 监听事件,执行相应操作 应用初始化、资源加载、Session 管理、统计在线人数

七、最佳实践

  1. Servlet

    • 尽量保持 Servlet 简洁,业务逻辑封装到 Service 层
    • 合理使用 loadOnStartup 参数控制初始化时机
  2. Filter

    • 合理设置过滤范围,避免不必要的性能消耗
    • 注意过滤器链的执行顺序
    • 不要在过滤器中执行复杂的业务逻辑
  3. Listener

    • 只在需要监听事件时使用
    • 初始化资源时注意异常处理
    • 确保资源正确释放

Servlet 三大组件是 Java Web 开发的基础,理解它们的工作原理和使用方法对于构建高效、安全的 Web 应用至关重要。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 Servlet 三大组件详解 https://www.zuozi.net/35634.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务