SpringBoot学习笔记【part10】Web开发——请求映射原理

SpringBoot POST请求接收单个参数:@RequestParam、@RequestBody与@ModelAttribute方案详解 在Web开发中,HTTP请求参数绑定是后端处理客户端数据的基础环节。其核心原理在于服务器根据请求的Content-Type和预定义的解析策略,将数据映射到控制器方法的参数上。这一过程的技术价值在于实现了前后端数据的无缝对接,保证了接口的健壮性与可维护性。常见的应用场景包括表单提交、RESTful API交互以及文件上传等。本文聚焦于SpringBoot框架下,针对POST请求中接收单个参数这一常见但易混淆的需求,深入剖析了@RequestParam、@RequestBody和@ModelAttribute等 阅读详情

SpringBoot 学习笔记 Part10

1. 请求映射

从@RequestMapping标注处理什么请求,到控制器方法的方法体返回值,这个过程就叫做请求映射,如下:

    @RequestMapping("hello")
    public String hello(){
        return "Hello SpringBoot 2 !";
    }

2. 请求映射原理

2.1 DispatcherServlet

springboot 所有的请求过来都会经过 DispatcherServlet,因为springboot底层仍用的是 springmvc,所以 DispatcherServlet 是处理所有请求的开始。

前往底层,我们可以发现 DispatcherServlet 最终继承于原生Servlet—— HttpServlet,其中继承树为 DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet。

现在我们想知道在哪个派生类中重写了 doGet 和 doPost,前往底层源码可以发现,在 FrameworkServlet 中有如下代码:

public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAware {
    /* 略 */
    protected final void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.processRequest(request, response);
    }

    protected final void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.processRequest(request, response);
    }

    protected final void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.processRequest(request, response);
    }

    protected final void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.processRequest(request, response);
    }
    /* 略 */
}

在 FrameworkServlet 的处理请求方法中都调用了本类的 processRequest( ) 方法,这个方法经分析,有大量初始化和清理操作,其中最重要的是它调用的 doService( ) 方法。

protected final void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /* 略 */
	this.doService(request, response);
    /* 略 */
}

追踪该 doService( ) 方法,我们发现这也是一个本类的方法,是一个抽象方法。不难推测,这个抽象方法将在下一个派生类也就是 DispatcherServlet 中实现。

protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception;

在 DispatcherServlet 的 doService 的实现方法中,有大量的处理,但我们最终把目光聚集到 doDispatcher 方法上。

protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
    /* 略 */
    this.doDispatch(request, response);
    /* 略 */
}

我们最终发现, doDispatcher 方法才是真正有功能的方法,它检查文件上传、确定当前请求的处理程序(找到当前请求使用哪个Controller方法处理) 等。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
	/* 略 */
    processedRequest = this.checkMultipart(request);
    mappedHandler = this.getHandler(processedRequest);
    /* 略 */
}

总结:当有请求进来时,调用顺序为:HttpServlet.doGet() -> FrameworkServlet.processRequest().doService() -> DispatcherServlet.doService().doDispatch()


2.2 doDispatch方法

doDispatcher 方法才是真正有请求处理功能的方法,它检查文件上传、确定当前请求的处理程序(找到当前请求使用哪个Controller方法处理) 等。节选源码如下,逐步分析。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
	/* 略 */
    processedRequest = this.checkMultipart(request); //检查是不是文件上传
    multipartRequestParsed = processedRequest != request;
    mappedHandler = this.getHandler(processedRequest); //找到当前请求使用哪个Controller方法处理
	/* 其他功能,略 */
}

2.3 getHandler方法

从 doDispatch方法 进入 getHandler方法。

@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
    if (this.handlerMappings != null)
    /* 略 */
}

HandlerMappings 译为处理器映射,即 /xxx 将被映射为 xxx,所有的处理器映射都被存在 handlerMappings 对象里。对第一行handlerMappings判空代码进行debug调试,可以发现存在5个handlerMapping。

在这里插入图片描述

其中下标为1的就是我们之前学习过的欢迎页,即springmvc在该对象里储存了欢迎页的映射规则。不难发现,下标为0的 RequestMappingHandlerMapping的前半段RequestMapping酷似我们之前学习过的注解 @RequestMapping,经过验证,这里就保存着我们所有被 @RequestMapping 标注过的 Controller 方法和handler的映射规则。其实项目一启动,@RequestMapping的映射规则就被springmvc解析并存储了。

继续 getHandler 方法的分析,下面是一个循环,遍历所有 @RequestMapping 映射规则意在找到对应的handler方法。通过debug,可以找到mappingRegistry对象,我之前编写的rest请求映射,都存在这里面。

在这里插入图片描述

总结:所有的请求映射都存在HandlerMappings中。


2.4 HandlerMappings

SpringBoot 中所有的请求映射都在 HandlerMappings 里。

在这里插入图片描述

在handlerMappings容器中我们可以发现,SpringBoot 自动配置了默认的 RequestMappingHandlerMapping、自动配置了欢迎页的 WelcomePageHandlerMapping(即使用 / 能访问到 index.html),以及之后学习的 BeanNameHandlerMapping、RouterFunctionMapping以及 SimpleUrlHandlerMapping。

SpringBoot的请求进来,会在getHandler方法里挨个尝试所有的 HandlerMapping 看其是否有对应的请求信息。若有则找到这个请求对应的 handler 并调用,若没有则去找下一个 HandlerMapping。


自定义HandlerMapping:
若在一些场景(如不同版本的方法调用:/api/v1/user、/api/v2/user)我们需要自定义一些映射处理,我们也可以自己给容器中放 自定义HandlerMapping。

HyperLynx中层叠设计实例 这两种方式有点区别,前一种方式只是增加层,需要自行修改层的类型,后一种方式可以选定为某一种类型,如果是增加信号层,软件会默认同时增加一层介质层。层叠已经有8层,按照示例的层叠有4个信号层、3个地平面层和1个电源平面层,对照进行层名称(LayerName)、介质类型(Type)及用途(Usage)设置。在这列中,有的是白色,有的是淡蓝色。白色的说明可以修改,如第一行是介质,通常在最外层的介质有两个用途,阻焊层和介质,单击该行会出现一个下拉菜单,选择SolderMask,即为阻焊层。... 阅读详情

相关推荐

基于LangGraph的智能报告生成平台项目分析

不知道你是否知道或者了解OpenAI and Gemini Deep Research。他们是一种能够根据输入问题进行规划、结合网络搜索获取信息并最终呈现结果的研究工具或技术。那这样research是如何实现的呢?最近刚好看到一个实现类似功能的开源项目: open_deep_search。本文将基于该项目进行代码层面剖析。

u011160113的博客 923

Spring Boot 中的请求映射是什么,如何使用

请求映射是 Spring Boot 中的一个核心概念,它是指将 HTTP 请求映射到处理请求的方法上。在 Spring Boot 中,我们可以使用 @RequestMapping 注解来定义请求映射关系。@RequestMapping 注解可以用在类上或方法上,用于指定类或方法可以处理哪些请求。请求映射是 Spring Boot 中的一个核心概念,它可以帮助我们将不同的请求映射到不同的处理方法上。

程序猿徐师兄的博客 1216

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

Spring MVC 解读——@RequestMapping (2)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34306676的博客 339

在centos7部署k8s搭建kubernetes集群

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。 Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找

山东梅长苏 1万+

4.2 多智能体系统的严格隔离机制:防止上下文污染与隐私数据脱敏实战

本文探讨了多智能体系统中上下文信息共享带来的安全风险与解决方案。研究发现,随着Agent数量增加,上下文信息泄露概率呈指数级上升,可能导致跨Agent错误传播、隐私泄露等问题。文章提出分层隔离架构,将上下文划分为全局共享和本地私有两部分,并通过命名空间隔离、递归压缩和隐私过滤技术确保数据安全。技术实现上,建议为每个子Agent创建独立状态空间,采用原子化更新和读写锁控制避免状态竞争。隐私保护方面,结合正则匹配和命名实体识别技术进行敏感数据过滤,确保符合GDPR等法规要求。这些措施共同构建了可靠、安全且合规的

公众号:AI前沿侦探 225

Spring @RequestMapping 注解原理

经过一番百度和钻研,这是我对该注解的浅析 开发者(程序猿)需要在控制器内部为每一个请求动作开发相应的处理方法。@RequestMapping 注解类型指示Spring用哪一个类或方法处理请求动作,该注解可用于类和方法。 @RequestMapping可以用来注释一个控制器类,在这种情况下,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。示例代...

AAAhxz的博客 2535

109. SAP ABAP 应用程序中的锁机制和工作原理介绍

SAP ABAP 系统中的锁概念,是 SAP ABAP 为了保证`数据一致性`而引入的一种保护机制。 像 SAP 这种复杂的企业级应用,系统中同一时间段的同一份数据,可能会有多个 Transaction(终端用户或者 API )同时进行读写操作。为了防止出现数据不一致,SAP ABAP 引入了锁机制。 这种锁机制并非数据库服务器层面的锁,而是在 SAP ABAP 应用服务器层面上工作,加锁和解锁都由专门的 ABAP Function Module 来完成。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1468

【学习】springmvc之@RequestMapping映射请求

1、使用简单的@RequestMapping映射请求 使用@RequestMapping注释来将URL映射/appointments到整个类或特定的处理程序方法。通常,类级注释将特定的请求路径(或路径模式)映射到表单控制器上,其他方法级注释缩小了特定HTTP方法请求方法(“GET”,“POST”等)的主映射,或HTTP请求参数条件。@RequestMapping一般都与@Controller配合

ixiaoyou的博客 2245

谷歌A2A协议入门指南:附简易Python代码示例

继"关税"之后,当下最热门的词汇当属AI智能体——这种基于人工智能的软件能够执行复杂任务、实现工作流自动化并提升生产效率。但迄今为止,大多数智能体都处于各自为政的状态,难以顺畅协作。就像团队执行重大项目时,成员之间却无法交流!对于技术人员而言,一个可能遇到的典型场景是:假设你需要协调四个不同的AI服务——处理用户查询的Gemini智能体、在向量数据库进行搜索的AI应用、基于Claude的摘要生成器,以及运行专业领域逻辑的Python智能体。

独立开发,substack顶级编辑 797

Dify 本地部署教程

到这里,Dify 就安装完成了,更多操作设置可以参考官方文档,Dify 和 FastGPT 基本上差不多,也可以同时安装一下 FastGPT 进行体验~Docker Compose 部署 | Dify。

Muti-Agent 6652

@RequestMapping 用法详解之地址映射(转)

引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam、 @RequestBody、 @...

weixin_34163553的博客 550

2024年Unity 面试题 |五萬字 二佰道| Unity面试题大全,面试题总结【全网最全,收藏一篇足够面试】

正所谓 金三银四 ,又到了找工作的大好时机了,不知道大家有没有意向找一份更好的工作呢~ 之前写了很多Unity的学习和实例文章,但是面试题部分还没有一个系统的整理。 那本篇文章就来整理一下Unity中一些常见的面试题,说不准就会面试的时候就会遇到! 本篇文章会将Unity所有方面的面试资料都融会贯通,绝对是2022年Unity面试领域最实用的文章啦!

努力前行,总会成为自己心中的那道光 17万+

SpringBoot学习笔记【part09】Web开发——rest使用与原理

SpringBoot 学习笔记 Part09 1. 请求映射 从@RequestMapping标注处理什么请求,到控制器方法的方法体返回值,这个过程就叫做请求映射,如下: @RequestMapping("hello") public String hello(){ return "Hello SpringBoot 2 !"; } 2. Rest映射 Rest风格支持,即使用HTTP请求方式动词来表示对资源的操作。 以前:/getUser 获取用户 /

Parker_cpp的博客 629

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringBoot学习笔记【part11】Web开发——请求参数的注解

SpringBoot 学习笔记 Part11 1. @PathVariable(获取路径变量) restful风格中,路径中传参不再使用 ?、& 和 key=value 形式了,而是使用 {value} 与 分隔符 / 来进行传递。 第一种方法是通过给 @PathVariable 的属性赋值来给形参变量进行映射。 @GetMapping("car/{id}/owner/{username}") public Map<String, Object> getUser(@PathVariab

Parker_cpp的博客 952

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SpringBoot专题学习Part12:SpringBoot在Web开发中对静态资源的映射规则

静态资源是例如js css img等资源 SpringBoot里的映射规则有很多种 让我们分类来了解: 一、配置webjars的路径 所有/webjars/**都会在/META-INF/resources/webjars/下寻找静态资源 webjars:以jar包的方式导入静态资源 可以以Maven依赖的方式引入例如jquery bootstrap等js文件 <dependency> ...

"✧treasure mountain✧" 8109

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SpringBoot学习笔记【part07】Web开发——静态资源访问

SpringBoot 学习笔记 Part07 1. 静态资源访问 1.1 静态资源目录 只要静态资源放在类路径下的四种特定命名的文件夹下,就可以被访问到。这四种特定命名的文件夹为: /static /public /resources /META-INF/resources 访问时无需加上文件夹名字,直接使用 项目根路径+资源名 即可访问。( 如localhost:8080/dog.png ) 在 springmvc 中,我们也可以改变默认的静态资源路径。 spring: web: re

Parker_cpp的博客 1163

Springboot-web篇---part02-引入资源,静态资源映射,国际化

默认访问首页的设置方式 方式一 : controller中 @RequestMapping({"/","/index.html"}) public String index(){ return "index"; } 方式二: MyMvcConfig中 //所有的WebMvcConfigurerAdapter组件都会一起起作用 @Bean//讲组件注册在容器中...

weixin_43729631的博客 205

黑马程序员JavaWeb(2023年版)学习笔记Part2

个人在学习JavaWeb中的学习笔记Part2

Dreamxiaomeng的博客 803

Springboot-web篇---part01-webjars

SpringBoot对静态资源的映射规则 1.所有/webjars/**,都去classpath:/META-INF/resources/webjars/找资源; webjars:以jar包的方式引入静态资源; https://www.webjars.org/ 引入静态资源jquary-webjars <dependency> <group...

weixin_43729631的博客 176

2022最新SpringBoot2.X仿B站项目part1笔记

文章目录SpringBoot仿B站项目介绍1.技术架构2.多模块的开发,多环境的配置2.1maven的本地配置2.2新建模块,POM文件2.3 父工程POM文件2.4创建Mysql的表格2.5YML文件遇到的bug,出现Autowire注册不了SpringBoot仿B站项目介绍 1.技术架构项目基于:Springboot2.x+mysql+mybatis+maven3.6x2.多模块的开发,多环境的配置。

zl5186888的博客 2659

SpringBoot part4 day03

1.SpringBoot整合web资源 2.完成web资源入门案例 3.以Ajax形式实现数据获取 4.分布式架构设计 5.搭建京淘后台服务器

weixin_47562812的博客 221

面试再问Spring?这份价值百万的的SpringBoot全栈笔记 看完直接怼他

虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。本文已被。

2401_84688466的博客 914

Part1 CMS服务端开发

Part1 CMS服务端开发 一.CMS需求分析 1、CMS是什么 ? 1、CMS是什么 ? CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同,比如:一个在线教育网站,有些公司认为CMS系统是对所有的课程资源进行管理,而在早期网站刚开始盛行时很多公司的业务是网站制作,当时对CMS的定位是创建网站,即对网站的页面、图片等静态资源进行管理。 2...

LNK937470228的博客 681

Java - 程序员面试笔记记录 & 实现 - Part5

Executor:拦截内部执行器,负责调用 StatementHandler 操作数据库,并把结果通过 ResultSetHandler 进行自动映射,还处理了二级缓存操作。StatementHandler:拦截SQL语法构建的处理。也实现了一级缓存。ParamenterHandler:拦截参数处理。ResultSetHandler:拦截结果集的处理。

Aye 1036

SpringBoot 中文手册 --Part IV --27

受  http://blog.youkuaiyun.com/column/details/13024.html 专栏启发,对后续部分进行翻译,方便使用时查阅; 本文翻译自 https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/htmlsingle  27. 开发WEB应用          SpringBoot 很

bingfengzhihuo521的博客 847
上一篇: SpringBoot学习笔记【part09】Web开发——rest使用与原理
下一篇: SpringBoot学习笔记【part11】Web开发——请求参数的注解
Parker7
博客等级 码龄7年 18粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Parker7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值