Java-servlet(四)详细讲解Servlet类层次结构与生命周期

Java-servlet(四)详细讲解Servlet和生命周期

  • 前言
  • 一、Servlet类层次结构
    • 1.Servlet包
    • 2.Servlet 与 ServletConfig 与 Serializable 的关系
      • 1. 三者分别是什么
      • 2. 三者之间的关系
    • 3.如何让类具有 Servlet 功能
  • 二、Servlet 生命周期
    • 1.初始化阶段
    • 2.服务阶段
    • 3.销毁阶段
  • 总结


前言

  • Servlet 是 Java Web 开发的核心组件负责处理客户端请求并生成响应
  • 理解 Servlet 的生命周期,能帮助我们写出更高效的 Web 应用。
  • 今天,我们就来深入探讨一下 Servlet 的类层次结构,以及它的生命周期。

我的Java-servlet文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12907265.html?spm=1001.2014.3001.5482


一、Servlet类层次结构

首先我们来说一说Servlet 功能是什么

  1. 处理请求:接收客户端(如浏览器)的各种请求,像 GET、POST 请求等。
  2. 生成响应:根据请求进行业务逻辑处理,生成 HTML、JSON 等形式的响应内容返回给客户端。
  3. 管理会话:能跟踪客户端的会话状态,比如用户登录后,可在多个页面维持登录状态。
  4. 与数据库交互:连接数据库,进行数据的增删改查操作,为客户端提供数据服务。

Java-servlet(四)详细讲解Servlet类层次结构与生命周期_第1张图片

1.Servlet包

在 Java Web 开发中,Servlet 主要涉及两个包

  • javax.servlet :这是 Servlet 的核心包包含了所有 Servlet 开发的基础接口和类
  • javax.servlet.http :这个包扩展了 javax.servlet ,提供了与 HTTP 协议相关的类和接口,比如 HttpServletRequest 和 HttpServletResponse 。

2.Servlet 与 ServletConfig 与 Serializable 的关系

下面我们来介绍介绍 Servlet、ServletConfig 和 Serializable 之间的关系。

1. 三者分别是什么

  • Servlet

    • Servlet 是 Java 中用于处理 Web 请求的组件。当客户端(比如浏览器)向服务器发送一个请求时,服务器会把这个请求交给对应的 Servlet 来处理,Servlet 处理完后再把响应返回给客户端。就好比你去餐厅吃饭,把点菜的需求告诉服务员(客户端请求),厨师(Servlet)就会根据你的需求做菜(处理请求),最后把做好的菜端给你(返回响应)
  • ServletConfig

    • ServletConfig 是 Servlet 的配置信息对象。当 Servlet 被创建时,服务器会为每个 Servlet 实例创建一个对应的 ServletConfig 对象,这个对象包含了 Servlet 的初始化参数和 Servlet 的名称等信息。可以把它想象成厨师做菜时需要的菜谱和特殊要求,这些信息帮助厨师更好地完成做菜的任务(Servlet 更好地处理请求)。
  • Serializable

    • Serializable 是 Java 中的一个接口,它没有任何方法,只是一个标记接口。当一个类实现了 Serializable 接口,就表示这个类的对象可以被序列化。序列化就是把对象的状态信息转换成可以存储或传输的形式,比如可以把对象保存到文件中,或者通过网络传输到其他地方。这就像你要把一件东西寄给别人,需要把它打包(序列化),对方收到后再拆开(反序列化)

2. 三者之间的关系

  • Servlet 和 ServletConfig 的关系
    • ServletConfig 是为 Servlet 服务的。在 Servlet 的生命周期中,当 Servlet 被初始化时,服务器会把 ServletConfig 对象传递给 Servlet 的 init(ServletConfig config) 方法,Servlet 可以通过这个对象获取初始化参数等配置信息。例如:
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class MyServlet implements Servlet {
    private ServletConfig config;

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        // 获取初始化参数
        String paramValue = config.getInitParameter("paramName");
        System.out.println("初始化参数值: " + paramValue);
    }

    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 处理请求
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        // 销毁操作
    }
}
  • Servlet 和 Serializable 的关系
    • Servlet 本身不一定需要实现 Serializable 接口。但是在某些情况下,比如服务器需要把 Servlet 对象序列化到磁盘上(例如进行会话迁移或者服务器重启时保存 Servlet 状态),那么 Servlet 类就需要实现 Serializable 接口。不过在实际开发中,这种情况比较少见,因为 Servlet 主要是处理请求和响应,通常不需要进行序列化操作。

综上所述,ServletConfig 是辅助 Servlet 完成初始化配置的,而 Serializable 是为了让 Servlet 对象可以被序列化,只有在特定需求下 Servlet 才会和 Serializable 产生关联。

对比项 Servlet ServletConfig Serializable
类型 接口(需实现) 接口(容器实现) 标记接口(无方法)
作用 处理客户端请求(核心功能) 存储Servlet配置参数(如初始化参数) 标识对象可序列化/反序列化
常见用途 - 实现Web业务逻辑
- 处理HTTP请求响应
- 在init()中读取配置参数 - 对象持久化(如文件存储、网络传输)
实现方式 - 继承HttpServlet(推荐)
- 实现Servlet接口
由容器自动注入(无需手动实现) 直接实现Serializable接口(无需方法)
与Servlet关系 核心处理组件 初始化时通过init()方法注入 通常不需要实现(除非需分布式复制)

Java-servlet(四)详细讲解Servlet类层次结构与生命周期_第2张图片

  • 在 Java Web 中, Servlet 是一个接口,定义了所有 Servlet 应该实现的基本方法。但直接实现这个接口可能会比较麻烦,因为我们需要手动处理很多细节。为了简化开发,Java 提供了两个抽象类:
  • GenericServlet :这是一个通用的 Servlet 实现,它实现了 Servlet 接口和 ServletConfig 接口,并且还实现了 Serializable 接口。 Serializable 接口的作用是让 Servlet 可以被序列化,方便在分布式环境中使用。
  • HttpServlet :这是 GenericServlet 的一个子类,专门用于处理 HTTP 请求。它提供了 doGet() 和 doPost() 等方法,分别用于处理 GET 和 POST 请求。

在 Web 开发中,GET 和 POST 是 HTTP 协议中两种常见的请求方法,用于客户端(如浏览器)向服务器发送请求并获取响应。

  • GET 请求是 HTTP 协议中最常用的请求方法之一,主要用于从服务器获取资源。
  • POST 请求主要用于向服务器提交数据,例如用户注册、登录、表单提交等操作。

3.如何让类具有 Servlet 功能

  • 直接实现 Servlet 接口:这是最基础的方法,但需要手动实现所有方法,比较繁琐。
  • 继承 GenericServlet 类:这种方式相对简单,因为 GenericServlet 已经实现了大部分方法,我们只需要重写 service() 方法即可。
  • 继承 HttpServlet 类:这是最常用的方式,尤其是当我们需要处理 HTTP 请求时。我们只需要重写 doGet() 或 doPost() 方法即可。

二、Servlet 生命周期

  • Servlet 的生命周期由容器(如 Tomcat)管理,主要分为三个阶段:初始化、服务和销毁。

1.初始化阶段

当 Servlet 被加载到容器中时,容器会调用 init() 方法来初始化 Servlet。这个方法只会被调用一次,通常用于加载配置文件、初始化数据库连接等操作。

@Override
public void init() throws ServletException {
    // 初始化代码
}

2.服务阶段

当客户端发送请求到 Servlet 时,容器会调用 service() 方法来处理请求。 service() 方法会根据请求的类型(GET 或 POST)调用对应的 doGet() 或 doPost() 方法。

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 处理 GET 请求
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 处理 POST 请求
}

3.销毁阶段

当 Servlet 不再被使用时,容器会调用 destroy() 方法来销毁 Servlet。这个方法也只会被调用一次,通常用于释放资源,比如关闭数据库连接

@Override
public void destroy() {
    // 销毁代码
}

总结

Servlet 类层次结构与核心功能

  1. 核心功能

    • 处理客户端请求(GET/POST 等),生成响应(HTML/JSON 等)。
    • 管理会话状态,支持数据库交互。
  2. 关键包

    • javax.servlet:基础接口(如 ServletServletConfig)。
    • javax.servlet.http:HTTP 扩展(如 HttpServletRequestHttpServlet)。
  3. 类关系与实现方式

    • Servlet:核心接口,定义生命周期方法(init()service()destroy())。
    • ServletConfig:存储 Servlet 初始化参数,通过 init() 注入。
    • Serializable:可选实现,支持对象序列化(如分布式场景)。
    • HttpServlet:常用子类,简化 HTTP 请求处理(覆盖 doGet()/doPost())。
  4. 实现方式对比

    • 直接实现 Servlet:需手动实现所有方法,灵活性高但繁琐。
    • 继承 GenericServlet:通用实现,需重写 service()
    • 继承 HttpServlet:推荐方式,专注处理 HTTP 请求。

Servlet 生命周期(容器管理)

  1. 初始化阶段

    • 容器调用 init(ServletConfig config),仅执行一次。
    • 用途:加载配置、初始化资源(如数据库连接)。
  2. 服务阶段

    • 容器调用 service(),根据请求类型(GET/POST)分发到 doGet()/doPost()
    • 核心逻辑:处理业务、生成响应。
  3. 销毁阶段

    • 容器调用 destroy(),仅执行一次。
    • 用途:释放资源(如关闭数据库连接)。

图示

生命周期阶段:
初始化 → 服务 → 销毁
对应方法:
init() → service() → destroy()

类层次结构:
Servlet(接口)
├─ GenericServlet(抽象类)
│  └─ HttpServlet(抽象类) → 常用子类
└─ ServletConfig(接口)

以上就是这篇博客的全部内容,下一篇我们将继续探索 Java-servlet 的更多精彩内容。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述

你可能感兴趣的:(Java,servlet,java,servlet,开发语言,运维,服务器,后端)