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() 每次请求都执行:核心业务逻辑写在这里,注意线程安全
相关推荐
Database_Cool_19 小时前
云数据仓库开通指南:阿里云 AnalyticDB MySQL 10 分钟从 0 到分析实战教程
数据仓库·mysql·阿里云
曾阿伦2 天前
Windows 下运行 Hadoop 并部署到 AWS EMR 指南
hadoop·windows·aws
罗政2 天前
基于AI工作流的多渠道销售数据仓库清洗统计实践
数据仓库
极光代码工作室3 天前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化
迈巴赫车主4 天前
湖仓一体(Data Lakehouse)简介
大数据·数据仓库·数据湖·湖仓一体
liuxiaowei34 天前
Winform+WPF双框架实战:喷涂工艺SCADA上位机从0到1搭建(附采集监控源码+车间踩坑实录)
大数据·hadoop·wpf
humbinal5 天前
同时支持 gui & cli 的 parquet 文件查看工具,高性能小清新!
hive·python·rust·spark·开源·github·parquet
RestCloud6 天前
ETL是什么?全域数据集成平台核心能力解析
数据仓库·etl·数据清洗·数据处理·etlcloud·数据集成工具
Gent_倪7 天前
万字详解:数据库、数据仓库、数据湖、湖仓一体
数据库·数据仓库·spark
Microsoft Word7 天前
把RAG从 “能跑” 做到上线
数据仓库·人工智能