Servlet 快速入门

news2025/6/6 7:16:33

文章目录

    • 概念
    • SpringBoot 测试案例
    • 执行原理
      • 传统 Servlet
      • 在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中请求从浏览器到业务代码的完整步骤
        • 关键点
        • 流程图
    • 参考

概念

运行在服务器端的小程序, Servlet 就是一个接口,定义 Java 类被浏览器访问到(Tomcat识别)的规则

SpringBoot 测试案例

创建简单的 SpringBoot 项目进行测试,首先创建 Java 空项目,根据 POM 配置文件构建简单的 SpringBoot 项目

    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.5.0</version>
        </dependency>
    </dependencies>

需要注意的是,如果是 Servlet5.0 以上需要 Jakarta EE 依赖,而 Servlet 4.0 及以下则需要 Java EE 依赖

Jakarta EE 依赖

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
    <scope>provided</scope>
</dependency>

Java EE 依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

创建 Servlet 测试类,抽象实现 Servlet 接口,添加 @WebServlet 注解并指定 URL 映射,使用 @WebServlet 注解声明了这个类为 Servlet,该注解会在部署时被容器处理,容器根据其具体的属性配置将相应的类部署为 Servlet。

@WebServlet 是 Servlet 3.0(Jakarta Servlet 3.0) 引入的注解,用来在 不写 web.xml 的情况下向 Servlet 容器注册一个 HttpServlet 子类。它与早期基于 web.xml 的 <servlet> / <servlet-mapping> 配置功能等价,但更符合 “约定优于配置” 的理念,能让一个普通 Java 类 就地声明 自己的元数据(名称、URL 映射、初始化参数等)并立刻生效。

@WebServlet("/demo")
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    // 提供服务的方法
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet!");
    }

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

    @Override
    public void destroy() {

    }
}

在 SpringBoot 启动类中新增 @ServletComponentScan 注解,SpringBoot 会把所有带 @WebServlet@WebFilter@WebListener 的组件交给内置容器(Tomcat/Jetty/Undertow)自动注册。

@SpringBootApplication
@ServletComponentScan
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

当访问 /demo 接口时,会输出 Hello Servlet!

2025-06-03T14:59:21.629+08:00  INFO 76957 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2025-06-03T14:59:21.633+08:00  INFO 76957 --- [           main] web.servlet.DemoApplication              : Started DemoApplication in 0.525 seconds (process running for 0.696)
Hello Servlet!

执行原理

传统 Servlet

  • 当服务器接收到客户端浏览器的请求后,会解析请求 URL 路径,获取访问 Servlet 的资源路径
  • 查找 web.xml 文件,是否找到对应的 <url-pattern> 标签体内容
  • 如果有,则在找到对应的 <servlet-class> 全类名
  • Tomcat 会将字节码文件加载到内容,并创建其对象
  • 调用其对应 service 方法

在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中请求从浏览器到业务代码的完整步骤

  • 嵌入式 Tomcat 解析 HTTP 报文。RequestResponse 对象在 Tomcat 层创建后,仍按 Servlet 规范传递给下游组件
  • SpringBoot 没有 web.xml,在启动时自动向容器注册一个核心 Servlet —— DispatcherServlet,并将所有路径(/)映射给它(DispatcherServletRegistrationBean 完成注册)
  • DispatcherServlet 统一接管,后续 URL 再由 Spring 框架内部解析,而不是 Tomcat 直接查找其他 Servlet
  • Spring 容器在启动阶段就把 DispatcherServlet 作为 Bean 创建并交给 Tomcat;若使用 @WebServletServletRegistrationBean 等方式,还能额外注册自定义原生 Servlet
  • Tomcat 把 HttpServletRequest/Response 交给 DispatcherServlet.service()
  • 之后进入 Spring MVC 专属流程
    • HandlerMapping:根据 URI、HTTP 方法匹配到具体 @Controller / @RestController 的方法(Handler)
    • HandlerAdapter:选用合适的适配器(通常是 RequestMappingHandlerAdapter)调用该方法
    • 调用业务方法:参数解析、依赖注入、校验、AOP 切面等在这一层生效;方法返回值随后被包装成 ModelAndView 或直接写回 JSON
    • ViewResolver / HttpMessageConverter:将返回值渲染成 HTML、JSON、XML 等;最后写入 HttpServletResponse
关键点
  • 自动装配,DispatcherServletAutoConfiguration 在 SpringBoot 启动时运行
    • 创建 DispatcherServlet Bean
    • 把其 URL 映射(默认为 /)注册到嵌入式 Tomcat(或 Jetty/Undertow)
    • 允许通过 spring.mvc.servlet.path 修改前缀,或定义多个 ServletRegistrationBean 手动注册其他 Servlet
  • 过滤器与监听器
    • 使用 FilterRegistrationBean@WebFilter@ServletComponentScan 或 Spring Security 的 FilterChain 定义过滤器
    • 容器仍按 Servlet 规范的 FilterServletListener 次序执行,只是对象由 Spring 托管并可享受依赖注入与配置属性。
流程图
浏览器
  │
HTTP 请求
  │
嵌入式 Tomcat (解析协议、线程池)
  │
DispatcherServlet (统一入口)
  │
HandlerMapping → 找控制器
  │
HandlerAdapter → 解析参数 + AOP
  │
Controller 方法(业务逻辑)
  │
HttpMessageConverter / ViewResolver
  │
DispatcherServlet
  │
Tomcat 写回 HTTP 响应
  ▼
浏览器

参考

  • Title Unavailable | Site Unreachable

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】CSS面试八股

网上现有资料已经很丰富了&#xff0c;我挑了些自己押面试题时总结过的来写。 Q&#xff1a;回流和重绘 A&#xff1a; 回流reflow&#xff1a;计算元素的几何&#xff0c;引发layout重绘repaint&#xff1a;更新元素可见样式&#xff0c;引发paint 回流的成本比重绘高得多&…

Redis底层数据结构之字典(Dict)

Dict基本结构 Dict我们可以想象成目录&#xff0c;要翻看什么内容&#xff0c;直接通过目录能找到页数&#xff0c;翻过去看。如果没有目录&#xff0c;我们需要一页一页往后翻&#xff0c;这样时间复杂度就与遍历的O(n)一样了&#xff0c;而用了Dict我们就可以在O(1)的时间复杂…

佰力博科技与您探讨低温介电温谱测试仪的应用领域

低温介电温谱测试应用领域有如下&#xff1a; 一、电子材料&#xff1a; 低温介电温谱测试仪广泛应用于电子材料的性能测试&#xff0c;如陶瓷材料、半导体材料、压电材料等。通过该设备&#xff0c;可以评估材料在高温或低温环境下的介电性能&#xff0c;为材料的优化和应用提…

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理)

背景需求&#xff1a; 1-4月电子屏表格&#xff0c;都是用这个代码将EXCEL数据整理成分类成3个WORD表格。 【办公类-48-04】20250118每月电子屏台账汇总成docx-4&#xff08;提取EXCLE里面1月份的内容&#xff0c;自制月份文件夹&#xff09;-CSDN博客文章浏览阅读1.2k次&…

基于 ZYNQ UltraScale+ OV5640的高速图像传输系统设计,支持国产替代

引 言 随着电子信息技术的不断进步&#xff0c;人工智能、医 疗器械、机器视觉等领域都在高速发展 [1] &#xff0c;工业相机 是机器视觉系统中的一部分 [2] &#xff0c;对工业相机而言&#xff0c;传 输图像的速率、传输过程的抗干扰能力是其关键&#xff0c; 工业相…

demo_win10配置WSL、DockerDesktop环境,本地部署Dify,ngrok公网测试

win10配置WSL、DockerDesktop环境&#xff0c;本地部署Dify&#xff0c;ngrok分享测试 一、配置WSL 1.1 开启Hyper-V 安装WSL2首先要保证操作系统可以开启hyper-v功能&#xff0c;默认支持开启hyper-v的版本为&#xff1a;Windows11企业版、专业版或教育版,而家庭版是不支持…

TablePlus:一个跨平台的数据库管理工具

TablePlus 是一款现代化的跨平台&#xff08;Window、Linux、macOS、iOS&#xff09;数据库管理工具&#xff0c;提供直观的界面和强大的功能&#xff0c;可以帮助用户轻松管理和操作数据库。 TablePlus 免费版可以永久使用&#xff0c;但是只能同时打开 2 个连接窗口&#xff…

SQL Indexes(索引)

目录 Indexes Using Clustered Indexes Using Nonclustered Indexes Declaring Indexes Using Indexes Finding Rows Without Indexes Finding Rows in a Heap with a Nonclustered Index Finding Rows in a Clustered Index Finding Rows in a Clustered Index with …

Axure 基础入门

目录 认识产品经理 项目团队* 基本概述 认识产品经理 A公司产品经理 B公司产品经理 C公司产品经理 D公司产品经理 产品经理工作范围 产品经理工作流程* 产品经理的职责 产品经理的分类 产品经理能力要求 产品工具 产品体验报告 原型设计介绍 原型设计概述 为…

结构型设计模式之Decorator(装饰器)

结构型设计模式之Decorator&#xff08;装饰器&#xff09; 前言&#xff1a; 本案例通过李四举例&#xff0c;不改变源代码的情况下 对“才艺”进行增强。 摘要&#xff1a; 摘要&#xff1a; 装饰器模式是一种结构型设计模式&#xff0c;允许动态地为对象添加功能而不改变其…

HCIP-Datacom Core Technology V1.0_3 OSPF基础

动态路由协议简介 静态路由相比较动态路由有什么优点呢。 静态路由协议&#xff0c;当网络发生故障或者网络拓扑发生变更&#xff0c;它需要管理员手工配置去干预静态路由配置&#xff0c;但是动态路由协议&#xff0c;它能够及时自己感应网络拓扑变化&#xff0c;不路由选择…

工作自动化——工作自动提炼--智能编程——仙盟创梦IDE

工作自动化中的自动提炼、自动比对代码生成日志&#xff0c;为软件开发与项目管理带来诸多好处。 自动提炼能从复杂代码中精准提取关键信息&#xff0c;节省人工梳理时间&#xff0c;开发人员可快速把握核心逻辑&#xff0c;加速项目熟悉进程。自动比对代码则及时发现版本间差异…

大语言模型评测体系全解析(上篇):基础框架与综合评测平台

文章目录 一、评测体系的历史演进与技术底座&#xff08;一&#xff09;发展历程&#xff1a;从单任务到全维度评测1. 2018年前&#xff1a;单数据集时代的萌芽2. 2019-2023年&#xff1a;多任务基准的爆发式增长3. 2024年至今&#xff1a;动态化、场景化、多模态体系成型关键节…

生产环境MYSQL常见锁表场景

前言 锁表是我们在生产环境十分常见的问题之一&#xff0c;解决问题前需要先了解锁表产生的原因以找到解决方案&#xff0c;并制定方案以预防锁表&#xff0c;本文接下来会分别模拟元数据锁表&#xff08;MDL锁&#xff09;、行锁升级为表锁、死锁、**显示锁表 **四种锁表情形…

结构性设计模式之Composite(组合)

结构性设计模式之Composite&#xff08;组合&#xff09; 摘要&#xff1a; Composite&#xff08;组合&#xff09;模式通过树形结构表示"部分-整体"层次关系&#xff0c;使得用户能够统一处理单个对象和组合对象。该模式包含Component&#xff08;组件接口&#x…

Java面试八股--04-MySQL

致谢&#xff1a;感谢整理&#xff01;2025年 Java 面试八股文&#xff08;20w字&#xff09;_java面试八股文-CSDN博客 目录 1、Select语句完整的执行顺序 2、MySQL事务 3、MyISAM和InnoDB的区别 4、悲观锁和乐观锁怎么实现 5、聚簇索引与非聚簇索引区别 6、什么情况下my…

设计模式——访问者设计模式(行为型)

摘要 访问者设计模式是一种行为型设计模式&#xff0c;它将数据结构与作用于结构上的操作解耦&#xff0c;允许在不修改数据结构的前提下增加新的操作行为。该模式包含关键角色如元素接口、具体元素类、访问者接口和具体访问者类。通过访问者模式&#xff0c;可以在不改变对象…

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 下

上部分链接&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09; 之 【高级查询和连接】 上 题目&#xff1a;1164. 指定日期的产品价格 题解&#xff1a; select product_id,10 price from Products group by product_id having min(change_date) > 201…

机器学习——SVM

1.什么是SVM 支持向量机&#xff08;support vector machines&#xff0c;SVM&#xff09;是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;SVM 的目的就是想要画出一条线&#xff0c;以 “最好地” 区分这两类点&#xff0c;以至如果以后有了…