Servlet
一、什么是 Servlet?
Servlet 是运行在服务器端的 Java 程序,它独立于平台和协议,专门用来接收和响应客户端(比如浏览器)的请求,是 JavaWeb 开发中处理动态请求的核心组件。
举个大白话例子:
浏览器给服务器发了一个 “我要查所有图书” 的请求,Servlet 就是服务器里专门接收这个请求、调用业务代码、最后把结果返回给浏览器的 “中间管家”。
它的核心作用有 3 个:
接收浏览器的 HTTP 请求(GET/POST)
调用 Service/DAO 层代码,处理业务逻辑
把处理结果(比如数据、页面)响应给浏览器
二、Servlet 接口及实现类
Servlet 本质上是一个接口,定义了 Servlet 对象和服务器之间的约定方法。我们写 Servlet,通常不会直接实现 Servlet 接口,而是继承它的实现类,最常用的是 HttpServlet。
-
Servlet 接口的核心方法
(1)init() 初始化方法
调用时机:Servlet 第一次被访问时,服务器会创建 Servlet 对象,然后调用 init() 方法,整个生命周期里只会调用一次。
作用:完成 Servlet 的初始化工作,比如加载配置文件、初始化资源。
特点:默认是第一次访问时创建,也可以通过配置让服务器启动时就创建。
(2)service() 服务方法
调用时机:每次客户端请求这个 Servlet 时,服务器都会调用 service() 方法。
作用:处理客户端的请求,根据请求方式(GET/POST)调用对应的 doGet() 或 doPost() 方法。
(3)destroy() 销毁方法
调用时机:服务器关闭、项目停止或 Servlet 被卸载时,服务器会调用 destroy() 方法,整个生命周期里只会调用一次。
作用:释放 Servlet 占用的资源,比如关闭数据库连接、释放文件流。
(4)getServletConfig() 配置方法
作用:获取 Servlet 的配置信息,比如 web.xml 中配置的初始化参数。
(5)getServletInfo() 信息方法
作用:返回 Servlet 的基本信息,比如作者、版本,一般很少用。 -
常用实现类:HttpServlet
我们写业务代码时,直接继承 HttpServlet 就可以了,它已经帮我们实现了 Servlet 接口的大部分方法,我们只需要重写 doGet() 和 doPost() 来处理请求即可。
一个最简单的 Servlet 示例:
java
运行
@WebServlet("/helloServlet")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("Hello Servlet!");
}@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
三、Servlet 的生命周期
Servlet 的生命周期,就是从它被创建到被销毁的整个过程,一共分为 4 个阶段:
加载与初始化(init())
服务器第一次接收到对该 Servlet 的请求时,会加载 Servlet 类,创建 Servlet 对象,然后调用 init() 方法完成初始化,只执行一次。
处理请求(service()/doGet()/doPost())
每次客户端请求这个 Servlet 时,服务器都会调用 service() 方法,由它根据请求方式分发到对应的 doGet() 或 doPost() 方法,每次请求都会执行。
服务终止(destroy())
当服务器关闭、项目卸载或 Servlet 长时间未被访问被服务器销毁时,会调用 destroy() 方法释放资源,只执行一次。
垃圾回收
destroy() 方法执行后,Servlet 对象会被标记为垃圾,等待 JVM 的垃圾回收器回收。
用一句话总结生命周期流程:
加载类 → 创建对象 → 调用init()初始化 → 多次调用service()处理请求 → 调用destroy()销毁 → 垃圾回收
四、Servlet 的两种配置方式 -
注解配置(常用)
从 Servlet 3.0 开始,支持用 @WebServlet 注解配置 Servlet 的访问路径,不需要写 web.xml 文件:
java
运行
@WebServlet(urlPatterns = "/bookListServlet")
public class BookListServlet extends HttpServlet {
// ...
} -
web.xml 配置(传统方式)
在 WEB-INF/web.xml 文件中配置 Servlet 和它的访问路径:
xml
BookListServlet
com.servlet.BookListServlet
BookListServlet
/bookListServlet
五、答辩 / 考试高频考点(必背)
Servlet 的生命周期有哪几个阶段?每个阶段调用什么方法?
答:4 个阶段,分别是加载初始化(init())、处理请求(service()/doGet()/doPost())、销毁(destroy())、垃圾回收。其中 init() 和 destroy() 只会执行一次,service() 每次请求都会执行。
doGet() 和 doPost() 有什么区别?
答:doGet() 处理 GET 请求,请求参数会拼在 URL 里,安全性低,参数长度有限制;doPost() 处理 POST 请求,参数放在请求体中,安全性高,参数长度无限制。
Servlet 是单例还是多例?
答:Servlet 是单例的,整个项目中同一个 Servlet 只会创建一个对象,所有请求都共用这一个对象,所以要注意线程安全问题,不要在 Servlet 中定义成员变量存储请求相关的数据。
转发和重定向有什么区别?
答:
转发(request.getRequestDispatcher().forward()):服务器内部跳转,一次请求,地址栏不变,共享 request 域数据。
重定向(response.sendRedirect()):浏览器两次请求,地址栏会变,不共享 request 域数据。

浙公网安备 33010602011771号