跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java Servlet 核心指南:从原理到 Spring Boot 实战

Java Servlet 是构建 Web 应用的基础组件,负责处理 HTTP 请求与响应。本文深入解析 Servlet 生命周期、核心 API(如 HttpServletRequest、HttpServletResponse)、会话管理及过滤器机制。结合 Spring Boot 实战,演示了如何配置嵌入式容器、注册自定义组件及实现异步处理。涵盖线程安全、资源管理、安全防护等最佳实践,并提供登录、文件上传等完整代码案例,适合希望掌握 Java Web 底层原理的开发者参考。

Stephaine Walsh发布于 2026/4/7更新于 2026/10/2595 浏览
Java Servlet 核心指南:从原理到 Spring Boot 实战

Servlet 概述

简单来说,Servlet 就是跑在服务器上的 Java 程序,充当客户端(通常是浏览器)和后端逻辑之间的中间层。它的主要职责是扩展服务器功能、处理 HTTP 请求并生成响应。

为什么需要 Servlet?

相比静态 HTML,Servlet 能根据参数或数据库结果动态生成内容。它驻留内存,处理速度快,且具备平台独立性。作为 JSP、Spring MVC 等框架的基石,它的功能非常强大。

Servlet 与 CGI 的比较

特性CGIServlet
进程模型每个请求创建新进程多线程处理(轻量级)
性能启动慢,资源消耗大启动快,资源消耗小
平台依赖语言/平台基于 Java,跨平台
持久性无驻留内存,可保持状态

Servlet 在 Web 应用中的位置

浏览器 (HTTP Request) -> Web Server (Tomcat, Jetty) -> Servlet Container -> Servlet | Servlet (HTTP Response) <- Servlet Container <- Web Server <- 浏览器 (HTTP Response)
  • Web 服务器: 处理网络连接。
  • Servlet 容器: 管理生命周期,常见如 Tomcat、Jetty。
  • Servlet: 业务逻辑单元。

Servlet API 核心

Servlet API 主要由两个包组成,Jakarta EE 9+ 后包名从 javax.servlet 迁移至 jakarta.servlet。

javax.servlet / jakarta.servlet 包

包含协议无关的核心接口,如 Servlet(生命周期)、ServletContext(应用范围共享)、ServletRequest 等。

javax.servlet.http / jakarta.servlet.http 包

提供 HTTP 特有接口,如 HttpServlet、HttpServletRequest、HttpServletResponse 和 HttpSession。

Servlet 生命周期

生命周期由容器管理,包含三个关键方法:

init(ServletConfig config)

实例创建后、首次请求前调用一次。用于一次性初始化,如读取配置或建立连接池。注意不要在此处直接创建数据库连接,建议使用连接池管理。

service(ServletRequest req, ServletResponse res)

每次请求到达时调用。容器会为每个请求创建新线程执行此方法,因此Servlet 必须是线程安全的,避免使用实例变量存储请求状态。

destroy()

应用卸载或服务器关闭时调用一次。用于清理资源,如关闭连接。

HttpServlet 详解

开发 HTTP Servlet 最常用的基类,继承自 GenericServlet。

核心方法

  • doGet: 处理 GET 请求,通常用于查询数据。
  • doPost: 处理 POST 请求,通常用于提交数据。
  • doPut, doDelete: 分别对应更新和删除操作。

实际开发中,我们继承 HttpServlet 并重写需要的 doXxx 方法即可。

处理 HTTP 请求参数

参数可通过 URL 查询字符串或请求体传递。

  • getParameter(String name): 获取单个值。
  • getParameterValues(String name): 获取多值参数(如复选框)。
  • getParameterMap(): 获取所有参数。

注意:处理非 ASCII 字符时,需在调用 getParameter 前设置编码,如 request.setCharacterEncoding("UTF-8")。

HttpServletRequest

封装了客户端发送的所有 HTTP 请求信息。

获取请求信息

  • getMethod(): 获取 HTTP 方法。
  • getRequestURI(): 获取请求 URI。
  • getHeader(String name): 获取请求头。
  • getCookies(): 获取 Cookie 数组。

请求属性与分发

属性存储在 request 对象中,仅在当前请求范围内有效,常用于 Servlet 间传递数据。

  • 转发 (forward): 完全交给目标资源,URL 不变。
  • 包含 (include): 将目标资源输出包含在当前响应中。
RequestDispatcher dispatcher = request.getRequestDispatcher("/path/to/resource");
dispatcher.forward(request, response);

HttpServletResponse

用于生成发送给客户端的响应。

设置状态码与头信息

  • setStatus(int sc): 设置状态码。
  • sendError(int sc, String msg): 发送错误。
  • setContentType(String type): 设置内容类型,如 text/html;charset=UTF-8。

获取输出流

  • getOutputStream(): 二进制数据。
  • getWriter(): 文本数据。 两者不能同时调用。

重定向

response.sendRedirect("/newpage");

告诉浏览器发起新的请求,地址栏会改变。

会话管理 (HttpSession)

HTTP 是无状态的,Session 用于跟踪用户状态。

获取 Session

HttpSession session = request.getSession(); // 获取或创建
HttpSession session = request.getSession(false); // 仅获取,不存在则返回 null

存储与移除数据

  • setAttribute(name, value)
  • getAttribute(name)
  • removeAttribute(name)
  • invalidate(): 使会话失效。

超时配置

可在代码中设置 session.setMaxInactiveInterval(秒数),或在 web.xml 中配置 <session-timeout>。

Servlet 配置

支持 web.xml 部署描述符和注解两种方式。

web.xml 配置

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

注解配置 (@WebServlet)

Servlet 3.0+ 引入,更简洁。

@WebServlet(urlPatterns = "/annotated", name = "AnnotationServlet")
public class AnnotationServlet extends HttpServlet { ... }

Servlet 上下文 (ServletContext)

代表整个 Web 应用,所有组件共享同一个对象。

共享数据

  • setAttribute, getAttribute: 应用范围共享。
  • getInitParameter: 获取应用初始化参数。
  • getResourceAsStream: 读取 WEB-INF 下的资源。

Servlet 过滤器 (Filter)

拦截请求和响应,用于日志、安全、编码转换等横切关注点。

生命周期

  • init: 初始化。
  • doFilter: 核心逻辑,必须调用 chain.doFilter() 继续链式处理。
  • destroy: 销毁。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    // 前置处理
    chain.doFilter(request, response);
    // 后置处理
}

Servlet 监听器 (Listener)

监听 Web 应用事件,如 Context 创建、Session 销毁等。

常用接口

  • ServletContextListener: 监听应用启动/关闭。
  • HttpSessionListener: 监听会话创建/销毁。

异步 Servlet

传统模型阻塞线程,高并发下性能受限。Servlet 3.0+ 支持异步处理。

基本模式

@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        AsyncContext asyncContext = request.startAsync();
        executor.submit(() -> {
            try {
                Thread.sleep(5000);
                HttpServletResponse asyncResponse = (HttpServletResponse) asyncContext.getResponse();
                asyncResponse.getWriter().write("Async Response");
            } finally {
                asyncContext.complete();
            }
        });
    }
}

适用于长轮询、长时间计算等场景。

Servlet 与 Spring Boot

Spring Boot 底层仍运行在 Servlet 容器上,但简化了配置。

嵌入式容器

默认集成 Tomcat,无需单独部署 WAR。

注册组件

  • 方式一: 使用 @ServletComponentScan + @WebServlet 等注解。
  • 方式二: 使用 @Bean + ServletRegistrationBean,灵活性更高。

访问 Servlet API

在 Controller 中可直接注入 HttpServletRequest 等对象。

最佳实践

  1. 线程安全: 避免使用实例变量存储请求状态,多用局部变量。
  2. 资源管理: 使用 try-with-resources 自动关闭流和连接。
  3. 异常处理: 捕获预期异常,未捕获异常由容器处理,建议配置错误页面。
  4. 性能优化: 避免不必要的同步,使用连接池和缓存。
  5. 安全考虑: 防止 XSS(输出编码)、SQL 注入(预编译)、CSRF(Token 验证),敏感数据加密传输。

实战案例

案例一:基础用户登录与会话管理

演示如何验证凭据、创建 Session 及保护受保护页面。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private Map<String, String> validUsers = new HashMap<>();
    {
        validUsers.put("admin", "admin123");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if (validUsers.containsKey(username) && validUsers.get(username).equals(password)) {
            HttpSession session = request.getSession();
            session.setAttribute("user", username);
            response.sendRedirect("welcome");
        } else {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<h2>登录失败!</h2><a href='login'>返回</a>");
        }
    }
}

案例二:文件上传 Servlet

利用 @MultipartConfig 处理 multipart/form-data。

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Part filePart = request.getPart("file");
        String fileName = getSubmittedFileName(filePart);
        String filePath = getServletContext().getRealPath("/") + "uploads/" + fileName;
        filePart.write(filePath);
        response.getWriter().println("上传成功!");
    }
}

案例三:异步 Servlet 实现简单消息推送

模拟长轮询,延迟 5 秒后返回响应。

案例四:Spring Boot 中自定义 Filter 实现请求日志

记录 URL、IP 及耗时。

@Configuration
public class WebConfig {
    @Bean
    public FilterRegistrationBean<LoggingFilter> loggingFilter() {
        FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new LoggingFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

掌握这些核心概念与实战技巧,能让你在面对复杂的 Java Web 需求时更加游刃有余。无论是维护遗留系统还是构建现代微服务,Servlet 都是理解 Java Web 生态不可或缺的一环。

目录

  1. Servlet 概述
  2. 为什么需要 Servlet?
  3. Servlet 与 CGI 的比较
  4. Servlet 在 Web 应用中的位置
  5. Servlet API 核心
  6. javax.servlet / jakarta.servlet 包
  7. javax.servlet.http / jakarta.servlet.http 包
  8. Servlet 生命周期
  9. init(ServletConfig config)
  10. service(ServletRequest req, ServletResponse res)
  11. destroy()
  12. HttpServlet 详解
  13. 核心方法
  14. 处理 HTTP 请求参数
  15. HttpServletRequest
  16. 获取请求信息
  17. 请求属性与分发
  18. HttpServletResponse
  19. 设置状态码与头信息
  20. 获取输出流
  21. 重定向
  22. 会话管理 (HttpSession)
  23. 获取 Session
  24. 存储与移除数据
  25. 超时配置
  26. Servlet 配置
  27. web.xml 配置
  28. 注解配置 (@WebServlet)
  29. Servlet 上下文 (ServletContext)
  30. 共享数据
  31. Servlet 过滤器 (Filter)
  32. 生命周期
  33. Servlet 监听器 (Listener)
  34. 常用接口
  35. 异步 Servlet
  36. 基本模式
  37. Servlet 与 Spring Boot
  38. 嵌入式容器
  39. 注册组件
  40. 访问 Servlet API
  41. 最佳实践
  42. 实战案例
  43. 案例一:基础用户登录与会话管理
  44. 案例二:文件上传 Servlet
  45. 案例三:异步 Servlet 实现简单消息推送
  46. 案例四:Spring Boot 中自定义 Filter 实现请求日志

更多推荐文章

查看全部
  • Grok AI 国内访问及本地部署教程
  • 通义万相 2.1 集成与 AIGC 创作实战指南
  • Coze 工作流实战:逻辑控制、数据处理与 AIGC 多媒体应用
  • Java 算法:二分查找核心原理与经典例题
  • C++ 驱动 DPU 在医疗数据处理中的应用探索
  • 无人机飞行空域申请全流程指南
  • Python OpenCV 调用海康威视工业相机
  • C++ 多态底层实现原理详解:虚函数表与对象模型
  • TapNow 影视级 AI 视频平台实测:导演级精准控制与物理一致性
  • ROS 2 实战:海龟仿真器启动与 ros2 run 命令详解
  • C++26 静态反射元编程实战与核心技巧
  • 大模型算法实习面试复盘:RAG、LoRA、强化学习与 Agent 架构解析
  • 前端 Base64 文件上传:原理、实现与最佳实践
  • 基于 Neo4j 的知识图谱智能问答系统
  • 2026 国内 AI 编程订阅套餐横评与选型指南
  • 依赖注入:构建可测试的 Python 应用架构
  • AI 产品经理成长指南:核心技能与进阶路径
  • DeepSeek-R1-Distill-Llama-8B Python 爬虫实战:智能数据采集与清洗
  • C++ STL 哈希表详解:原理、冲突处理与模拟实现
  • 大模型落地如何重塑云计算行业竞争格局

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online