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

相关推荐
Wang's Blog5 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/6 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang6 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071577 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat7 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源7 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog7 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO98 小时前
指针的算术运算详解
java·数据结构·算法
sunshine22 girl8 小时前
Java学习六 Java常见API-2--String-3-字符串的截取替换和其他方法
java·开发语言·学习