news 2026/4/27 10:52:11

Servlet:访问流程、核心接口与生命周期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Servlet:访问流程、核心接口与生命周期

深入理解 Servlet:访问流程、核心接口与生命周期

在 Java Web 开发中,Servlet 是基石般的存在。无论是传统的 JSP 还是现代的 Spring MVC,底层都离不开 Servlet 的支持。本文将围绕 Servlet 的访问流程、体系结构、生命周期以及两个重要的配置对象(ServletConfig 和 ServletContext)展开,结合流程图与类图,帮助大家彻底掌握 Servlet 的核心原理。


一、Servlet 访问流程

浏览器向 Web 服务器发起请求,服务器根据 URL 映射找到对应的 Servlet,然后执行一系列操作。整个过程可以用下面的流程图表示:

自定义ServletServlet容器Web服务器浏览器自定义ServletServlet容器Web服务器浏览器发起HTTP请求解析请求,定位Servlet创建HttpServletRequest/HttpServletResponse对象调用service()方法处理请求并返回响应封装响应对象返回HTTP响应

关键点

  • 在调用service()方法之前,容器会自动创建HttpServletRequestHttpServletResponse对象。
  • service()方法会根据请求类型(GET、POST 等)分发给对应的doGet()doPost()方法。
  • 响应结束后,容器负责将响应数据发送回浏览器。

二、Servlet 体系结构(UML 类图)

Servlet 规范中,我们通常继承HttpServlet来编写自己的业务逻辑。下图展示了Servlet核心接口与类的继承关系:

实现

继承

继承

«interface»

Servlet

+init(ServletConfig config)

+service(ServletRequest req, ServletResponse res)

+destroy()

+getServletConfig()

+getServletInfo()

«abstract»

GenericServlet

-config: ServletConfig

+init(ServletConfig config)

+init()

+getServletConfig()

+getServletContext()

+log(String msg)

+abstract service(ServletRequest req, ServletResponse res)

«abstract»

HttpServlet

+service(ServletRequest req, ServletResponse res)

+service(HttpServletRequest req, HttpServletResponse resp)

+doGet(HttpServletRequest req, HttpServletResponse resp)

+doPost(HttpServletRequest req, HttpServletResponse resp)

+doPut(...)

+doDelete(...)

MyServlet

+doGet(HttpServletRequest req, HttpServletResponse resp)

+doPost(HttpServletRequest req, HttpServletResponse resp)

说明

  • Servlet接口定义了所有 Servlet 必须实现的生命周期方法。
  • GenericServlet抽象类提供了Servlet接口的基本实现,并增加了日志、初始化参数等辅助方法,但依然保留了service()方法为抽象。
  • HttpServlet进一步针对 HTTP 协议,将service()方法实现为请求类型分发器,并提供了doGet()doPost()等钩子方法。
  • 我们自定义的 Servlet 只需继承HttpServlet,重写需要的doXxx()方法即可。

三、Servlet 生命周期

Servlet 由 Web 容器(如 Tomcat)管理,其生命周期分为四个阶段:加载实例化 → 初始化 → 服务 → 销毁。下面用流程图展示:

容器启动或首次请求

加载Servlet类并实例化

调用init方法初始化

等待请求

收到请求,调用service方法

容器关闭或应用卸载

调用destroy方法,释放资源

各阶段详解

阶段时机次数说明
加载与实例化首次访问 Servlet 时,或容器启动时(若配置了<load-on-startup>1次通过反射调用无参构造器创建实例
初始化实例化之后立即执行1次调用init(ServletConfig config),可用于加载资源、获取配置
服务每次收到请求多次调用service()方法,根据请求类型分发到doGet/doPost
销毁容器正常关闭或应用被卸载时1次调用destroy()方法,释放数据库连接等资源

注意

  • 默认情况下,Servlet 在第一次被访问时才加载实例化。若希望在容器启动时就完成加载,可以在web.xml中配置<load-on-startup>正数(数值越小优先级越高)。
  • init()只执行一次,且是线程安全的(容器保证单例)。

四、ServletConfig 与 ServletContext

这两个接口是 Servlet 编程中获取配置和共享数据的关键。

1. ServletConfig

作用范围每个 Servlet 私有,由容器在init()方法中传入。

主要功能

  • 获取当前 Servlet 在web.xml中配置的初始化参数(<init-param>)。
  • 获取当前 Servlet 的名称(<servlet-name>)。
  • 获取全局的ServletContext对象。

配置示例web.xml):

<servlet><servlet-name>DemoServlet</servlet-name><servlet-class>com.example.DemoServlet</servlet-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></servlet>

代码使用

Stringencoding=getServletConfig().getInitParameter("encoding");StringservletName=getServletConfig().getServletName();ServletContextcontext=getServletConfig().getServletContext();

2. ServletContext

作用范围整个 Web 应用共享,一个应用只有一个ServletContext对象。

主要功能

  • 获取全局初始化参数:在<context-param>中配置的参数,所有 Servlet 均可读取。
  • 获取 Web 资源的绝对路径:通过getRealPath("/")getResourceAsStream()读取配置文件、图片等。
  • 作为域对象:在多个 Servlet 之间共享数据(setAttribute/getAttribute)。

配置示例web.xml):

<context-param><param-name>globalConfig</param-name><param-value>production</param-value></context-param>

代码使用

// 获取全局参数Stringconfig=getServletContext().getInitParameter("globalConfig");// 获取文件真实路径StringrealPath=getServletContext().getRealPath("/WEB-INF/config.properties");// 存储共享数据getServletContext().setAttribute("userCount",100);Integercount=(Integer)getServletContext().getAttribute("userCount");

五、总结

概念核心要点
访问流程浏览器 → Web服务器 → 容器创建 req/res → 调用 service → 返回响应
体系结构Servlet(接口) → GenericServlet(抽象类) → HttpServlet(抽象类) → 自定义Servlet
生命周期实例化(1次) → init(1次) → service(多次) → destroy(1次)
ServletConfig每个 Servlet 私有,用于获取自身初始化参数及 ServletContext
ServletContext整个应用共享,用于获取全局参数、资源路径、存储域数据
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 10:45:49

Chandra AI聊天助手实战:基于Python爬虫的数据采集与分析应用

Chandra AI聊天助手实战&#xff1a;基于Python爬虫的数据采集与分析应用 1. 引言 你有没有遇到过这样的情况&#xff1a;需要分析某个产品的用户评价&#xff0c;但手动复制粘贴成百上千条评论让你头疼不已&#xff1f;或者想要监控某个话题的舆情变化&#xff0c;却不知道从…

作者头像 李华
网站建设 2026/4/16 15:44:00

Zenodo数据下载终极指南:3步掌握科研数据获取神器

Zenodo数据下载终极指南&#xff1a;3步掌握科研数据获取神器 【免费下载链接】zenodo_get Zenodo_get: Downloader for Zenodo records 项目地址: https://gitcode.com/gh_mirrors/ze/zenodo_get 还在为从Zenodo平台下载科研数据而烦恼吗&#xff1f;&#x1f62b; 面对…

作者头像 李华
网站建设 2026/4/17 3:53:52

百度网盘秒传脚本技术解析与部署指南

百度网盘秒传脚本技术解析与部署指南 【免费下载链接】rapid-upload-userscript-doc 秒传链接提取脚本 - 文档&教程 项目地址: https://gitcode.com/gh_mirrors/ra/rapid-upload-userscript-doc 百度网盘秒传脚本是一款基于浏览器扩展技术的文件分享解决方案&#x…

作者头像 李华
网站建设 2026/4/16 12:15:33

车载测试实战:从CANoe操作到UDS诊断的面试精讲

1. CANoe在车载测试中的核心作用 第一次接触CANoe时&#xff0c;我也被这个工具的复杂性吓到过。但用久了才发现&#xff0c;它就像车载测试界的瑞士军刀&#xff0c;功能强大到让人离不开。简单来说&#xff0c;CANoe是我们与车辆通信系统对话的桥梁&#xff0c;没有它&#…

作者头像 李华