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 相关文章推荐
解析Java中的static关键字
Jun 14 Java/Android
分析Netty直接内存原理及应用
Jun 14 Java/Android
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
Springboot集成阿里云OSS上传文件系统教程
Jun 28 Java/Android
详解Spring事件发布与监听机制
Jun 30 Java/Android
spring cloud gateway中如何读取请求参数
Jul 15 Java/Android
gateway网关接口请求的校验方式
Jul 15 Java/Android
Java 在线考试云平台的实现
Nov 23 Java/Android
Android Flutter实现3D动画效果示例详解
Apr 07 Java/Android
Java版 单机五子棋
May 04 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
HttpClient实现表单提交上传文件
Aug 14 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
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
filemanage功能中用到的lib.js
2007/04/08 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
js完美的div拖拽实例代码
2014/01/22 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
2016/01/28 Javascript
逻辑表达式中与或非的用法详解
2016/06/06 Javascript
js实现无缝滚动图
2017/02/22 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
通过vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
2018/04/08 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
python导出chrome书签到markdown文件的实例代码
2017/12/27 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python中rb含义理解
2020/06/18 Python
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
中专毕业生求职简历的自我评价
2013/10/21 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
机器人总动员观后感
2015/06/09 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
初中语文教学反思范文
2016/03/03 职场文书
学习nginx基础知识
2021/09/04 Servers
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript