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

相关推荐
古法安卓1 小时前
Android-epoll原理详解
android·java·android studio
fireworks991 小时前
接口鉴权(401与403)
java·后端
wear工程师1 小时前
线程池里的异常去哪了?execute 和 submit 不是一回事
java
孔明click331 小时前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·sa-token·springboot·权限·权限认证
吴声子夜歌1 小时前
Java面试——设计模式(一)
java·设计模式·面试
半亩码田2 小时前
C#转Python第3.6篇:Python 的 @property 比 C# 的 get/set 更灵活
java·python·c#
wno7042 小时前
Spring Boot中使用Servlet
spring boot·后端·servlet
老郑聊AI业财智造2 小时前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
省长2 小时前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite2 小时前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端