当前位置: 首页 > article >正文

Servlet 快速入门

文章目录

    • 概念
    • 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 {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}// 提供服务的方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("Hello Servlet!");}@Overridepublic String getServletInfo() {return "";}@Overridepublic 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

相关文章:

Servlet 快速入门

文章目录 概念SpringBoot 测试案例执行原理传统 Servlet在 SpringBoot &#xff08;嵌入式 Tomcat Spring MVC&#xff09; 中请求从浏览器到业务代码的完整步骤关键点流程图 参考 概念 运行在服务器端的小程序&#xff0c; Servlet 就是一个接口&#xff0c;定义 Java 类被浏…...

【前端】CSS面试八股

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

[蓝桥杯]找到给定字符串中的不同字符

题目描述 在不考虑字符排列的条件下&#xff0c;对于相差只有一个字符的两个字符串&#xff0c;实现一个算法来识别相差的那个字符。要求如下&#xff1a; 当传入的字符串为 aad 和 ad 时&#xff0c;结果为 a。 当传入的字符串为 aaabccdd 和 abdcacade 时&#xff0c;结果为…...

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

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

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

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

ubuntu之开机自启frpc

在 Ubuntu 系统中为 frpc 设置开机自启&#xff08;以 frpc -c frpc.toml 命令为例&#xff09;&#xff0c;可以通过 systemd 服务实现。以下是详细步骤&#xff1a; 创建 systemd 服务文件 sudo vim /etc/systemd/system/frpc.service 写入以下内容&#xff08;根据你的路…...

【办公类-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次&…...

对 `llamafactory-cli api -h` 输出的详细解读

llamafactory-cli 是 LlamaFactory 项目提供的命令行接口工具&#xff0c;它允许用户通过命令行参数来配置和运行大型语言模型的各种任务&#xff0c;如预训练&#xff08;PT&#xff09;、有监督微调&#xff08;SFT&#xff09;、奖励模型训练&#xff08;RM&#xff09;、基…...

基于 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;加速项目熟悉进程。自动比对代码则及时发现版本间差异…...

go语言学习 第 2 章:变量与数据类型

第 2 章&#xff1a;变量与数据类型 在 Go 语言中&#xff0c;变量和数据类型是构建程序的基础。理解它们的使用方式和特性&#xff0c;对于编写高效、可维护的代码至关重要。本章将详细介绍变量的声明、初始化、使用以及 Go 语言中的各种数据类型。 一、变量的声明与初始化 …...

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

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

Spring Event(事件驱动机制)

一、Spring Event 应用场景 1. 业务解耦 当一个业务操作触发多个后续动作时&#xff0c;用事件解耦各个动作&#xff0c;避免代码耦合。 比如&#xff1a;用户注册后同时发送欢迎邮件、积分赠送、日志记录等&#xff0c;这些逻辑可以通过事件发布多个监听器异步处理。 2. 跨模…...

Fisher准则例题——给定类内散度矩阵和类样本均值

设有两类样本&#xff0c;两类样本的类内散度矩阵分别为 S 1 ( 1 1 / 2 1 / 2 1 ) , S 2 ( 1 − 1 / 2 − 1 / 2 1 ) S_1 \begin{pmatrix} 1 & 1/2 \\ 1/2 & 1 \end{pmatrix}, \quad S_2 \begin{pmatrix} 1 & -1/2 \\ -1/2 & 1 \end{pmatrix} S1​(11/2​1…...

MySQL数据库中INNODB表数据的备份与恢复

使用数据库时,其中非常重要的一块内容就是数据的安全,而保障数据安全的重要手段是数据备份与还原恢复。目前,我们主要的备份手段有逻辑备份、物理备份,逻辑备份一般适用范围很广,可以适用于解决不同版本间的备份与恢复,但一般执行时间长,而且备份占用空间大。这里介绍一…...

振动分析师(ISO18436-2)四级能力矩阵 - 简介

本文的内容绝大多数来自&#xff1a;VCAT-II Vibration Analyst - Mobius Institute相关振动分析员培训招生彩页&#xff0c;特此致谢&#xff01;内容整理参见&#xff1a;振动分析师四级能力矩阵 - 知乎。 CAT I 振动分析技术员 1.1角色画像 Collect vibration dataValida…...

生产环境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…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)复习(2) そう1,いAくな+さそうでう。2,なAな + そうです。3,いいです ー>よさそうです。4、x Xの状況(じょうきょう)5、みたい & ら…...

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

摘要 访问者设计模式是一种行为型设计模式&#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…...

《对象创建的秘密:Java 内存布局、逃逸分析与 TLAB 优化详解》

大家好呀&#xff01;今天我们来聊聊Java世界里那些"看不见摸不着"但又超级重要的东西——对象在内存里是怎么"住"的&#xff0c;以及JVM这个"超级管家"是怎么帮我们优化管理的。放心&#xff0c;我会用最接地气的方式讲解&#xff0c;保证连小学…...

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…...