Servlet 生命周期详解 - 实践

news/2026/1/21 20:30:36/文章来源:https://www.cnblogs.com/yangykaifa/p/19513972

Servlet 是 Java EE 规范中用于扩展 Web 服务器功能的核心组件。理解 Servlet 的生命周期对于开发健壮、高效的 Web 应用至关重要。Servlet 的生命周期由 Web 容器(如 Tomcat, Jetty)严格管理,主要包含三个阶段:初始化(Initialization)请求处理(Request Handling)销毁(Destruction)

1. 加载、实例化与初始化 (init())

  • 触发时机:当 Web 应用启动时,或者当客户端首次请求访问该 Servlet 时(取决于配置)。
  • 过程
    1. 加载:Web 容器根据部署描述符(web.xml)或注解(如 @WebServlet)定位 Servlet 类。
    2. 实例化:容器调用 Servlet 类的无参构造函数,创建一个 Servlet 实例。注意: 通常一个 Servlet 类在整个 Web 应用中只被实例化一次(单例模式),处理后续所有请求。
    3. 初始化:在实例化后,容器立即调用该实例的 init(ServletConfig config) 方法。
      • ServletConfig 对象:包含 Servlet 的初始化参数(在 web.xml 中配置或通过 @WebInitParam 注解指定)和 ServletContext 引用。
      • 用途:开发者可以在此方法中进行一次性的初始化工作,例如:
        • 建立数据库连接池
        • 加载配置文件
        • 初始化资源
        • 执行其他只需执行一次的设置任务
  • 关键点
    • init() 方法只会在 Servlet 实例的生命周期中被调用一次。
    • 如果初始化失败(例如抛出 ServletException),该 Servlet 实例将不会被投入使用,容器可能会记录错误。
public class MyServlet extends HttpServlet {private SomeResource resource; // 示例资源@Overridepublic void init() throws ServletException {// 通常重写无参的 init() 方法更方便super.init();// 执行初始化逻辑,例如:resource = initializeResource(); // 初始化资源}// ... 其他方法
}

2. 请求处理 (service() -> doGet(), doPost(), etc.)

  • 触发时机:每当有新的客户端请求(HTTP 请求)被映射到该 Servlet 时。
  • 过程
    1. 接收请求:Web 容器接收到一个指向该 Servlet 的 HTTP 请求。
    2. 创建对象:容器创建代表请求的 HttpServletRequest 对象和代表响应的 HttpServletResponse 对象。
    3. 调用 service():容器将 requestresponse 对象作为参数,调用 Servlet 实例的 service(HttpServletRequest req, HttpServletResponse resp) 方法。
    4. 分发请求:在 HttpServlet 类(绝大多数 Servlet 的基类)中,service() 方法会根据 HTTP 请求的方法(GET, POST, PUT, DELETE 等)调用相应的 doXxx() 方法。
      • 例如,GET 请求会调用 doGet(HttpServletRequest req, HttpServletResponse resp)
      • POST 请求会调用 doPost(HttpServletRequest req, HttpServletResponse resp)
    5. 执行业务逻辑:开发者通常在 doGet(), doPost() 等方法中编写处理请求的核心业务逻辑:
      • 读取请求参数
      • 访问数据库
      • 执行业务计算
      • 生成响应内容(HTML, JSON, XML 等)
      • 设置响应头、状态码
      • 将响应发送回客户端
  • 关键点
    • 此阶段是 Servlet 生命周期中最活跃的部分,会被反复调用以处理多个并发请求。
    • 线程安全:由于 Servlet 是单例的,其 service()doXxx() 方法会被多个线程同时访问。开发者必须谨慎处理实例变量(成员变量)的并发访问,避免线程安全问题。 通常建议使用局部变量或线程安全的结构。
    • 请求对象 (request) 和响应对象 (response) 的生命周期仅限于单个请求的处理过程。
public class MyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理 GET 请求的逻辑String param = request.getParameter("name"); // 获取请求参数// ... 业务处理 ...response.setContentType("text/html");PrintWriter out = response.getWriter();out.println("Hello, " + param + "!"); // 生成响应}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 处理 POST 请求的逻辑}
}

3. 销毁 (destroy())

  • 触发时机
    • Web 应用被停止或卸载时(例如服务器关闭、应用重新部署)。
    • Servlet 长时间空闲后(取决于容器实现,不常见)。
  • 过程:容器在回收 Servlet 实例之前,会调用其 destroy() 方法。
  • 用途:开发者可以在此方法中进行清理工作,释放 init() 方法中分配的资源,例如:
    • 关闭数据库连接
    • 保存状态到持久存储
    • 释放文件句柄、网络连接等
  • 关键点
    • destroy() 方法在 Servlet 生命周期中只被调用一次。
    • 一旦 destroy() 被调用,该 Servlet 实例将不再处理任何新的请求。
    • 容器保证在调用 destroy() 之前,所有正在该 Servlet 上执行的 service() 线程(处理请求的线程)都已完成或超时终止。
    • 在此方法中,可以访问 ServletContext 获取应用级别的信息,但不能再访问请求或响应对象。
public class MyServlet extends HttpServlet {private SomeResource resource; // 在 init() 中初始化@Overridepublic void destroy() {// 执行清理逻辑,例如:if (resource != null) {resource.cleanup(); // 清理资源}super.destroy();}
}

生命周期流程图

graph LR
A[Web 应用启动/首次请求] --> B[容器加载 Servlet 类]
B --> C[容器实例化 Servlet
调用构造函数] C --> D[容器调用 init(ServletConfig)] D --> E[Servlet 就绪] E --> F{客户端请求到达?} F -- Yes --> G[容器创建 request/response 对象] G --> H[容器调用 service(request, response)] H --> I[service 方法根据请求方法
调用 doGet/doPost/等] I --> J[执行业务逻辑
生成响应] J --> K[发送响应] K --> F F -- No --> L{应用停止/卸载?} L -- Yes --> M[容器调用 destroy()] M --> N[释放资源] N --> O[Servlet 实例被垃圾回收] L -- No --> F

总结

Servlet 的生命周期是一个清晰定义的模型:

  1. init() 一次:用于初始化。
  2. service()/doXxx() 多次:用于处理请求(核心)。
  3. destroy() 一次:用于清理。

Web 容器负责精确管理这个生命周期。开发者应遵循这个模型,在正确的方法中编写相应的代码(初始化在 init(),业务逻辑在 doGet()/doPost() 等,清理在 destroy()),并特别注意 Servlet 单例特性带来的线程安全问题。理解并合理利用 Servlet 生命周期是构建稳定 Java Web 应用的基础。

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

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

相关文章

【剑斩OFFER】算法的暴力美学——力扣 127 题:单词接龙

一、题目描述 二、算法原理 思路:跟边权为 1 的最短路径一样,使用 BFS 算法就能解决 https://blog.csdn.net/2403_84958571/article/details/157183596?spm1011.2415.3001.10575&sharefrommp_manage_link 三、代码实现 class Solution { public…

2026成都最新全包装修品牌top5评测!服务深度覆盖金牛区、新都区、青羊区、成华区等地优质公司权威榜单发布,赋能品质家居生活新体验

随着人们对居住品质要求的不断提升,全包装修凭借其省心、便捷、一体化的服务优势,成为众多家庭和企业装修的首选。本榜单基于服务范围覆盖度、设计团队实力、施工质量保障、环保材料应用及客户口碑五大维度(四川大晶…

鑫成誉-小黄鸭电动车小程序界面设计

项目背景2025 年,共享两轮车进入“3.0 时代”:政策对电池安全、车辆秩序、数据合规提出更高要求;用户侧则希望“随借随还、一眼找到、一秒换电”。小黄鸭出行需要在 6 个月内完成一次品牌升级,既要守住“亲民、可爱”的视觉资产&a…

循环神经网络与注意力机制

RNN:循环神经网络,它主要用于处理序列问题,常见的如文本序列(给出一段文本对下一个词进行生成),处理序列数据有一个问题,那就是组成序列的数据之间有很强的相关性,这就要求数据在前向传播进行训练的时候带上之前…

论 qys

注:本文非原创,由笔者改编自神秘 note.ms 小文章。侵权删。 球月深和samzhy的一天 声明:本人有想磕GTY的东西的行为。 对于七22班的球月深来说,这一天原本应该是个平淡无奇的周二中午。 正值盛夏,窗外的蝉鸣不知疲…

【故障诊断】动态系统的故障诊断和容错控制研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

error: no matching function for call to ros::NodeHandle::param()

博客地址:https://www.cnblogs.com/zylyehuo/系统版本:ROS1 noetic原始版 nh.param("odom_topic", _odom_topic_, "/f_lio_localization_node/Odometry");odom_topic 的类型是 std::string &quo…

大模型学习宝典:10个Agent实战项目+90天系统学习路径,助你轻松拿下AI产品经理面试

文章提供了大模型AI的90天系统学习路径,分为初阶应用(10天)、高阶应用(30天)、模型训练(30天)和商业闭环(20天)四个阶段,涵盖提示工程、RAG系统搭建、模型微调及商业部署等实战技能,帮助学习者从零掌握AI大模型技术,提升职场竞争力…

导师严选9个AI论文网站,MBA论文写作必备!

导师严选9个AI论文网站,MBA论文写作必备! AI 工具如何重塑论文写作的效率与质量 在当前学术研究日益数字化的背景下,AI 工具正逐步成为 MBA 学生和科研工作者不可或缺的助手。尤其是在论文写作过程中,AI 技术不仅能够显著降低 A…

蓝凌EKP产品:关联机制浅析

在 EKP 系统中,“关联机制”是实现跨业务对象关联、文档互相关联的重要基础能力。本文将从实际项目落地角度,完整介绍关联机制的接入步骤、关键代码以及常见注意事项,帮助你一次性跑通整个流程。一、关联机制简介关联机制用于在主业务对象&am…

【故障诊断】基于WMSST结合MCNN-BiGRU-Attention的故障诊断研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

【故障诊断】基于WMSST结合MCNN-BiGRU-Attention的故障诊断研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

导师推荐9个AI论文网站,专科生轻松搞定毕业论文格式规范!

导师推荐9个AI论文网站,专科生轻松搞定毕业论文格式规范! AI 工具让论文写作变得轻松高效 在当前的学术环境中,越来越多的专科生开始借助 AI 工具来辅助完成毕业论文。这些工具不仅能够帮助学生快速生成初稿,还能在格式规范、语…

2026成都最新清水房装修企业top5评测!服务深度覆盖金牛区、新都区、青羊区、成华区等地优质公司权威榜单发布,定义成都品质居住新标杆.

随着成都房地产市场的持续发展,清水房装修需求日益多元化,从刚需公寓到别墅大宅,业主对装修品质、环保标准与个性化设计的要求不断提升。本榜单基于环保性能、设计实力、工程质量、服务覆盖四大维度(四川大晶装饰新…

让LLM听懂指令!利用现有模型生成高质量合成数据进行微调

文章介绍如何利用现有强大LLM生成高质量合成对话数据微调目标模型,通过Disilabel开源框架实现:准备指令/问题,让多个候选LLM生成回答,用更强的"评委LLM"评估质量,选择最优回答与指令配对,形成高质…

【故障诊断的归一化判别图嵌入】输出包括 NDGE 的最终投影矩阵、不同维度的准确率和每个样本对不同故障模式的概率附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码及仿真…

程序员收藏!35岁转行大模型开发完全指南:零基础也能学会,前景无限好

文章分析了35岁转行学习AI大模型的可行性、零基础学习路径及行业前景。35岁正值学习黄金期,零基础可通过在线资源和持续实践掌握技能。AI大模型开发作为技术热点,应用广泛,需求持续增长,掌握该技能能带来良好职业发展。文章提供7阶…

精通大数据领域Doris:高级操作技巧分享

精通大数据领域Doris:高级操作技巧分享 关键词:大数据、Doris、高级操作技巧、数据处理、性能优化 摘要:本文围绕大数据领域的Doris展开,旨在为读者深入介绍Doris的高级操作技巧。从背景知识入手,详细阐述Doris的核心概念与联系、核心算法原理及操作步骤,通过数学模型和公…

ubuntu设置CPU和GPU拉满

ubuntu设置CPU和GPU拉满CPU 拉满 sudo cpupower frequency-set -g performance GPU 功率 + 风扇 sudo nvidia-smi -pm 1 sudo nvidia-smi -pl <MAX_WATT> nvidia-settings -a "[gpu:0]/GPUFanControlState=…

2026固定式机械臂优质品牌推荐指南

2026固定式机械臂优质品牌推荐指南一、行业背景与筛选维度依据据《2026-2030年中国工业机械臂行业发展白皮书》数据显示,2026年国内固定式机械臂市场规模同比增长18.7%,矿山开采、建材生产、钢铁冶炼等行业的自动化升…