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() 每次请求都执行:核心业务逻辑写在这里,注意线程安全
相关推荐
juniperhan1 天前
Flink 系列第4篇:Flink 时间系统与 Timer 定时器实战精讲
java·大数据·数据仓库·flink
juniperhan1 天前
link 系列第7篇:Flink 状态管理全解析(原理+类型+存储+实操)
大数据·数据仓库·flink
juniperhan1 天前
Flink 系列第6篇:Watermark 水印全解析(原理+实操+避坑)
大数据·数据仓库·flink
武子康2 天前
大数据-264 实时数仓-MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
武子康2 天前
大数据-265 实时数仓-Canal MySQL Binlog配置详解:从原理到实践|数据恢复与主从复制实战
大数据·hadoop·后端
晓纪同学2 天前
WPF-03 第一个WPF程序
大数据·hadoop·wpf
2501_933329552 天前
技术深度剖析:Infoseek 字节探索舆情处置系统的全链路架构与核心实现
大数据·数据仓库·人工智能·自然语言处理·架构
xiaoyaohou112 天前
024、大数据技术栈概览:Hadoop、Spark与Flink
大数据·hadoop·spark
虚幻如影2 天前
Hive 中“STRING类型无需显式指定长度
数据仓库·hive·hadoop