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 的工作方式了。

相关推荐
thefool11226610 小时前
TCP 1
java·1024程序员节
金銀銅鐵12 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手13 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck14 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280415 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑15 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔16 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n16 小时前
【JUC】四种内存屏障示例
java·1024程序员节
念何架构之路17 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo717 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java