一、Servlet 基础概念
1. 核心定义
- Servlet 是 Java 提供的一门 动态 web 资源开发技术,用于生成动态网页内容。
- Servlet 是 JavaEE 规范之一 ,本质是一个接口,我们需要自定义类实现 Servlet 接口,由 web 服务器(如 Tomcat)来运行。
- 官方定义:
A servlet is a small Java program that runs within a Web server.(Servlet 是运行在 Web 服务器中的小型 Java 程序)
2. Servlet 快速入门步骤
-
创建 web 项目,导入 Servlet 依赖坐标 (pom.xml)
xml
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>scope=provided表示该依赖由 Tomcat 容器提供,打包时不打入 war 包。 -
定义类,实现 Servlet 接口,重写所有方法 ,在
service()中编写业务逻辑java
运行
@WebServlet("/demo1") public class ServletDemo1 implements Servlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("servlet hello world~"); } // 其他4个方法重写省略 } -
配置访问路径 :在类上使用
@WebServlet注解,配置 Servlet 的访问路径 -
访问测试 :启动 Tomcat,浏览器输入 URL 访问:
http://localhost:8080/web-demo/demo1
3. Servlet 执行流程
- Servlet 由谁创建?方法由谁调用? Servlet 由 web 服务器(Tomcat) 创建,Servlet 方法也由 web 服务器调用。
- 服务器怎么知道 Servlet 一定有 service 方法? 因为自定义 Servlet 必须实现 Servlet 接口,而 Servlet 接口中定义了
service()方法,服务器通过接口规范保证方法存在。
二、Servlet 接口 5 大核心方法
表格
| 方法名 | 作用 | 调用时机 | 调用次数 |
|---|---|---|---|
void init(ServletConfig config) |
初始化方法 | Servlet 第一次被访问时(默认),实例化后调用 | 1 次 |
void service(ServletRequest req, ServletResponse res) |
提供服务方法 | 每次 Servlet 被访问时 | 多次 |
void destroy() |
销毁方法 | 内存释放 / 服务器关闭时,Servlet 对象销毁前 | 1 次 |
ServletConfig getServletConfig() |
获取 ServletConfig 对象 | 任意时刻,用于获取 Servlet 配置信息 | 按需调用 |
String getServletInfo() |
获取 Servlet 信息 | 任意时刻,用于获取 Servlet 版本、作者等信息 | 按需调用 |
各方法详细说明
1. init() 初始化方法
java
运行
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init...");
}
- 作用:完成 Servlet 的初始化工作,如加载配置文件、创建数据库连接等
- 参数
ServletConfig:Servlet 配置对象,用于获取 Servlet 初始化参数
2. service() 服务方法
java
运行
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet hello world~");
}
- 作用:处理客户端请求,生成响应
- 参数:
ServletRequest req:封装 HTTP 请求信息ServletResponse res:封装 HTTP 响应信息
- 异常:
ServletException(Servlet 异常)、IOException(IO 异常)
3. destroy() 销毁方法
java
运行
@Override
public void destroy() {
// 资源释放逻辑
}
- 作用:释放 Servlet 占用的资源,如关闭连接、销毁对象等
- 调用时机:服务器正常关闭、Servlet 被卸载时
三、Servlet 生命周期
Servlet 运行在 Servlet 容器(web 服务器)中,生命周期由容器管理,分为 4 个阶段:
- 加载和实例化 :默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象
- 初始化 :实例化后,容器调用
init()方法完成初始化,只执行 1 次 - 请求处理 :每次请求 Servlet 时,容器调用
service()方法处理请求,执行多次 - 服务终止 :服务器关闭 / 内存释放时,容器调用
destroy()方法释放资源,之后实例被 JVM 垃圾回收
loadOnStartup 配置(控制实例化时机)
通过 @WebServlet 注解的 loadOnStartup 属性,修改 Servlet 实例化时机:
java
运行
@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
- 负整数(默认 -1):第一次被访问时创建 Servlet 对象
- 0 或正整数 :服务器启动时创建 Servlet 对象,数字越小,优先级越高
四、Servlet 体系结构
1. 继承体系
plaintext
Servlet(根接口)
↑ 实现
GenericServlet(抽象实现类,实现 Servlet 接口,空实现部分方法)
↑ 继承
HttpServlet(对 HTTP 协议封装的实现类,专门用于处理 HTTP 请求)
2. HttpServlet 使用
开发 B/S 架构的 Web 项目时,我们自定义 Servlet 直接继承 HttpServlet,无需直接实现 Servlet 接口。
使用步骤
-
继承 HttpServlet
-
重写
doGet()和doPost()方法 ,分别处理 GET 和 POST 请求java
运行
@WebServlet("/demo4") public class ServletDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求逻辑 } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求逻辑 // 通常让 doPost 调用 doGet,统一处理逻辑 doGet(req, resp); } }
原理
HttpServlet 的 service() 方法会自动获取请求方式 ,根据不同的请求方式(GET/POST/PUT/DELETE 等),调用对应的 doGet()/doPost()/doPut() 等方法,简化了开发。
五、关键补充
1. Servlet 与 HTTP 请求方式
- 直接实现 Servlet 接口时,
service()方法需要手动判断请求方式,再做不同处理 - 继承
HttpServlet后,由容器自动分发请求到对应doXxx()方法,开发更高效
2. 常见误区
- Servlet 单实例:一个 Servlet 类在容器中只会创建一个实例,所有请求共享同一个对象,因此要注意线程安全问题
init()只执行一次:适合做全局初始化,不要在init()中处理请求service()每次请求都执行:核心业务逻辑写在这里,注意线程安全