Java Web 三大组件之 Servlet:从入门到理解生命周期

1. 什么是 Servlet?

Servlet 是 Java Web 开发中最核心的组件之一。简单来说,Servlet 就是一个运行在 Web 服务器(如 Tomcat)上的 Java 程序 ,它的主要工作是接收用户的请求,处理业务逻辑,然后返回响应结果

你可以把 Servlet 想象成一个餐厅的服务员

  • 顾客(浏览器)点菜(发送 HTTP 请求)
  • 服务员(Servlet)接收菜单
  • 服务员把菜单传给后厨(业务逻辑层/数据库)
  • 后厨做好菜后,服务员再把菜端给顾客(返回 HTTP 响应)

在 Java Web 中,Servlet 是 Java EE 规范 定义的一套接口和类,任何 Java Web 服务器都必须支持它。

2. Servlet 的三大核心作用

Servlet 之所以被称为 Web 三大组件之一(另外两个是 Filter 和 Listener),是因为它承担了以下三个关键职责:

  1. 接收请求:解析浏览器发来的 HTTP 请求,获取参数、表单数据、请求头等信息。
  2. 处理业务:调用 Java 代码完成登录验证、数据查询、文件上传等逻辑。
  3. 返回响应:生成 HTML 页面、JSON 数据或文件流,通过 HTTP 响应返回给浏览器。

3. 如何编写一个 Servlet?

编写一个 Servlet 非常简单,只需要三步:

3.1 创建一个类,继承 HttpServlet

java 复制代码
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("<h1>你好,Servlet!</h1>");
    }
}

3.2 重写 doGet 或 doPost 方法

  • doGet:处理 GET 请求(如浏览器直接访问、点击链接)
  • doPost:处理 POST 请求(如表单提交)

3.3 在 web.xml 或使用注解配置映射路径

方式一:注解(推荐,Servlet 3.0+)

java 复制代码
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    // ...
}

方式二:web.xml 配置

xml 复制代码
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.example.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

配置完成后,启动 Tomcat,在浏览器访问 http://localhost:8080/项目名/hello 就能看到效果了。

4. Servlet 的生命周期(重点)

Servlet 的生命周期由 Web 服务器(Tomcat)管理,一共经历 三个阶段

4.1 初始化阶段 ------ init()

  • 什么时候执行? 当 Servlet 第一次被请求时,或者服务器启动时(如果配置了 load-on-startup)。
  • 执行几次? 只执行一次
  • 做什么? 加载配置文件、建立数据库连接、初始化全局资源等一次性准备工作。
java 复制代码
@Override
public void init() {
    System.out.println("Servlet 初始化了,只执行一次");
}

4.2 服务阶段 ------ service() / doGet() / doPost()

  • 什么时候执行? 每次有请求到达时。
  • 执行几次? 每次请求都会执行
  • 执行流程: 服务器收到请求 → 调用 service() 方法 → 根据请求类型(GET/POST)自动调用对应的 doGet()doPost()
java 复制代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    System.out.println("处理了一次 GET 请求");
    resp.getWriter().write("Hello");
}

4.3 销毁阶段 ------ destroy()

  • 什么时候执行? 当 Web 应用被关闭或服务器停止时。
  • 执行几次? 只执行一次
  • 做什么? 释放资源,如关闭数据库连接、停止后台线程等。
java 复制代码
@Override
public void destroy() {
    System.out.println("Servlet 销毁了,释放资源");
}

生命周期总结(用生活例子理解)

阶段 类比 执行次数
init() 餐厅开业前,服务员接受培训、领工服 1 次
service() 营业中,每次来客人都要服务 每次请求
destroy() 餐厅关门,服务员交还工服、下班 1 次

5. Servlet 的特点总结

  • 单实例多线程:一个 Servlet 类在内存中只有一个实例,但可以同时处理多个请求(每个请求一个线程)。所以要注意线程安全问题。
  • 由容器管理:Servlet 的创建、调用、销毁都由 Tomcat 等 Web 容器负责,开发者只需写业务逻辑。
  • 跨平台:因为基于 Java,一次编写,到处运行。
  • 性能高:相比传统的 CGI,Servlet 不需要为每个请求创建新进程,效率更高。

6. 动手实践建议

建议你按照以下步骤亲手写一个 Servlet:

  1. 创建一个 Maven Web 项目(或直接在 IDE 中新建 Dynamic Web Project)
  2. 编写一个继承 HttpServlet 的类,重写 doGet 方法
  3. 使用 @WebServlet 注解配置访问路径
  4. 部署到 Tomcat 并启动
  5. 在浏览器访问,观察控制台输出的生命周期日志

通过亲手实践,你就能真正理解 Servlet 的工作方式了。

相关推荐
Zane19941 小时前
ThreadLocal 与 BlockingQueue:线程本地变量的内存泄漏原理,以及阻塞队列怎么选?
java·后端
用户3126874877201 小时前
Spring Bean 生命周期到底经历了什么?从实例化到销毁的全链路拆解
java·spring boot
Flittly1 小时前
【我的手搓轮子日记】(2)handmade-ioc 手搓 IOC 容器
java·spring boot·spring
阿昌喜欢吃黄桃1 小时前
Dubbo服务重启时注册中心下线不及时问题排查与修复记录
java·rpc·dubbo·问题排查
confiself2 小时前
树形思考研究进展
java·大数据·微服务
还是鼠鼠2 小时前
【Spring AI智能体实战 01】Java开发者接入大模型:国内平台、Token与API Key入门
java·大模型·spring ai·deepseek·阿里云百炼
zerozrc02 小时前
Java Lambda 底层实现
java
AlunYegeer2 小时前
Spring Boot 多模块服务间 API Token 鉴权排查记录
java·spring boot·后端
编程风暴2 小时前
3类人群的数据分析实习类型选择+4条选错红线
java·前端·数据分析
钱六两2 小时前
Spring AI 使用 MCP 客户端(调用高德 MCP)
java·人工智能·spring