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),是因为它承担了以下三个关键职责:
- 接收请求:解析浏览器发来的 HTTP 请求,获取参数、表单数据、请求头等信息。
- 处理业务:调用 Java 代码完成登录验证、数据查询、文件上传等逻辑。
- 返回响应:生成 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:
- 创建一个 Maven Web 项目(或直接在 IDE 中新建 Dynamic Web Project)
- 编写一个继承 HttpServlet 的类,重写 doGet 方法
- 使用
@WebServlet注解配置访问路径 - 部署到 Tomcat 并启动
- 在浏览器访问,观察控制台输出的生命周期日志
通过亲手实践,你就能真正理解 Servlet 的工作方式了。