javaweb--04

一、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 快速入门步骤

  1. 创建 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 包。

  2. 定义类,实现 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个方法重写省略
    }
  3. 配置访问路径 :在类上使用 @WebServlet 注解,配置 Servlet 的访问路径

  4. 访问测试 :启动 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 个阶段:

  1. 加载和实例化 :默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象
  2. 初始化 :实例化后,容器调用 init() 方法完成初始化,只执行 1 次
  3. 请求处理 :每次请求 Servlet 时,容器调用 service() 方法处理请求,执行多次
  4. 服务终止 :服务器关闭 / 内存释放时,容器调用 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 接口。

使用步骤
  1. 继承 HttpServlet

  2. 重写 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);
        }
    }
原理

HttpServletservice() 方法会自动获取请求方式 ,根据不同的请求方式(GET/POST/PUT/DELETE 等),调用对应的 doGet()/doPost()/doPut() 等方法,简化了开发。


五、关键补充

1. Servlet 与 HTTP 请求方式

  • 直接实现 Servlet 接口时,service() 方法需要手动判断请求方式,再做不同处理
  • 继承 HttpServlet 后,由容器自动分发请求到对应 doXxx() 方法,开发更高效

2. 常见误区

  • Servlet 单实例:一个 Servlet 类在容器中只会创建一个实例,所有请求共享同一个对象,因此要注意线程安全问题
  • init() 只执行一次:适合做全局初始化,不要在 init() 中处理请求
  • service() 每次请求都执行:核心业务逻辑写在这里,注意线程安全
相关推荐
2501_9272835819 小时前
荣联汇智助力天津艺虹打造“软硬一体”智慧工厂,全流程自动化引领印刷包装行业数智变革
大数据·运维·数据仓库·人工智能·低代码·自动化
孤雪心殇1 天前
快速上手数仓基础知识
数据仓库·hive·spark
渣渣盟1 天前
数据仓库 vs 数据湖 vs 湖仓一体:架构演进与选型
数据仓库·架构
隐于花海,等待花开1 天前
39.ROUND / FLOOR / CEIL 函数深度解析
hive·hadoop
juniperhan1 天前
Flink 系列第22篇:Flink SQL 参数配置与性能调优指南:从 Checkpoint 到聚合优化
大数据·数据仓库·分布式·sql·flink
juniperhan2 天前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
看海的四叔2 天前
【SQL】SQL-管好你的字符串
大数据·数据库·hive·sql·数据分析·字符串
坚持就完事了2 天前
YARN资源管理器
大数据·linux·hadoop·学习
渣渣盟2 天前
大数据技术栈全景图:从零到一的入门路线(深度实战版)
大数据·hadoop·python·flink·spark
地球资源数据云2 天前
1960年-2024年中国棉花产量数据集
大数据·数据结构·数据仓库·人工智能