Servlet

一、什么是 Servlet?
Servlet 是运行在服务器端的 Java 程序,它独立于平台和协议,专门用来接收和响应客户端(比如浏览器)的请求,是 JavaWeb 开发中处理动态请求的核心组件。
举个大白话例子:
浏览器给服务器发了一个 “我要查所有图书” 的请求,Servlet 就是服务器里专门接收这个请求、调用业务代码、最后把结果返回给浏览器的 “中间管家”。
它的核心作用有 3 个:
接收浏览器的 HTTP 请求(GET/POST)
调用 Service/DAO 层代码,处理业务逻辑
把处理结果(比如数据、页面)响应给浏览器
二、Servlet 接口及实现类
Servlet 本质上是一个接口,定义了 Servlet 对象和服务器之间的约定方法。我们写 Servlet,通常不会直接实现 Servlet 接口,而是继承它的实现类,最常用的是 HttpServlet。

  1. 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 的基本信息,比如作者、版本,一般很少用。

  2. 常用实现类: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 的两种配置方式

  3. 注解配置(常用)
    从 Servlet 3.0 开始,支持用 @WebServlet 注解配置 Servlet 的访问路径,不需要写 web.xml 文件:
    java
    运行
    @WebServlet(urlPatterns = "/bookListServlet")
    public class BookListServlet extends HttpServlet {
    // ...
    }

  4. 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 域数据。

posted @ 2026-04-24 16:31  忽晚0707  阅读(2)  评论(0)    收藏  举报