Java Spring Boot请求方式与请求映射过程分析


Posted in Java/Android onJune 25, 2022

请求方式

Spring Boot支持Rest风格:使用HTTP请求方式的动词来表示对资源的操作

非Rest风格

以前这样写接口:

/getUser   获取用户    
/deleteUser 删除用户    
/updateUser  修改用户      
/saveUser 保存用户
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
    public String getUser() {
        return "GET";
    }
    @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
    public String deleteUser() {
        return "POST";
    }
    @RequestMapping(value = "/updateUser", method = RequestMethod.POST)
    public String updateUser() {
        return "POST";
    }
    @RequestMapping(value = "/saveUser", method = RequestMethod.POST)
    public String saveUser() {
        return "POST";
    }

使用Rest风格

使用Rest风格,则这样写接口:

/user    GET-获取用户    DELETE-删除用户     PUT-修改用户      POST-保存用户
@GetMapping("/user")
    public String getUser() {
        return "GET";
    }
    @PostMapping("/user")
    public String saveUser() {
        return "POST";
    }
    @PutMapping("/user")
    public String putUser() {
        return "PUT";
    }
    @DeleteMapping("/user")
    public String deleteUser() {
        return "DELETE";
    }

表单提交

通过表单方式提交请求,请求类型只能支持Get与Post

若表单提交要使用REST风格,则表单请求方式使用Post,添加隐藏域 _method=put、 _method=delete方式来支持Rest风格

示例如下:

<form action="/user" method="post">
	<input name="_method" type="hidden" value="delete"/>
    <input value="REST提交" type="submit"/>
</form>

SpringBoot配置文件中开启页面表单的Rest功能

spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

过程分析

首先是从自动配置类WebMvcAutoConfiguration开始,其中的hiddenHttpMethodFilter方法入手,请求首先被该方法拦截

Java Spring Boot请求方式与请求映射过程分析

接着创建OrderedHiddenHttpMethodFilter对象,其又继承HiddenHttpMethodFilter

Java Spring Boot请求方式与请求映射过程分析

HiddenHttpMethodFilter中的doFilterInternal核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method

Java Spring Boot请求方式与请求映射过程分析

request.getParameter(this.methodParam)从请求中获取_method参数进行判断拦截,故可修改默认_method,自定义隐藏参数。

@Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
        methodFilter.setMethodParam("_mymethod");
        return methodFilter;
    }

请求映射过程分析

首先一个请求肯定会经过HttpServlet类的doGet()doPost()等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:

Java Spring Boot请求方式与请求映射过程分析

推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet类的doGet()方法

Java Spring Boot请求方式与请求映射过程分析

processRequest方法又调用了doService方法

Java Spring Boot请求方式与请求映射过程分析

doService方法是一个接口,FrameworkServlet并没有具体实现

Java Spring Boot请求方式与请求映射过程分析

不过DispatcherServlet对其经行了具体实现,doService方法中又调用doDispatch核心请求分发方法

Java Spring Boot请求方式与请求映射过程分析

doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)

Java Spring Boot请求方式与请求映射过程分析

Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求

Java Spring Boot请求方式与请求映射过程分析

在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则

如下:某Controller层的/index请求方法就与RequestMappingHandlerMapping进行了关联绑定

Java Spring Boot请求方式与请求映射过程分析

接着再执行mapping.getHandler(request)

Java Spring Boot请求方式与请求映射过程分析

执行this.getHandlerInternal(request),来到AbstractHandlerMethodMapping类重写的方法

Java Spring Boot请求方式与请求映射过程分析

执行 super.getHandlerInternal(request);得到当前请求Path

Java Spring Boot请求方式与请求映射过程分析

执行this.lookupHandlerMethod(lookupPath, request);进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。

Java Spring Boot请求方式与请求映射过程分析

到此,Spring Boot的请求映射过程解析完毕。

最终,请求映射过程中涉及的类如下:

Java Spring Boot请求方式与请求映射过程分析

到此这篇关于Java Spring Boot请求方式与请求映射过程分析的文章就介绍到这了,更多相关Spring Boot请求映射内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
SpringCloud Alibaba 基本开发框架搭建过程
Jun 13 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
Jul 15 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
Aug 02 Java/Android
logback 实现给变量指定默认值
Aug 30 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
Java基础——Map集合
Apr 01 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
java如何实现获取客户端ip地址的示例代码
Apr 07 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 #Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 #Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 #Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 #Java/Android
springboot读取resources下文件的方式详解
Jun 21 #Java/Android
java实现自定义时钟并实现走时功能
Jun 21 #Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 #Java/Android
You might like
简单的过滤字符串中的HTML标记
2006/12/25 PHP
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
基于jquery的放大镜效果
2012/05/30 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
2019/11/04 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
Python通过VGG16模型实现图像风格转换操作详解
2020/01/16 Python
Python实现井字棋小游戏
2020/03/09 Python
Python3读写ini配置文件的示例
2020/11/06 Python
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
建筑实习自我鉴定
2013/10/18 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
Nginx配置使用详解
2022/07/07 Servers