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 相关文章推荐
源码解读Spring-Integration执行过程
Jun 11 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
Sleuth+logback 设置traceid 及自定义信息方式
Jul 26 Java/Android
深入解读Java三大集合之map list set的用法
Nov 11 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java 超详细讲解IO操作字节流与字符流
Mar 25 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
零基础学java之带参数以及返回值的方法
Apr 10 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Spring中bean集合注入的方法详解
Jul 07 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 柱状图实现代码
2009/12/04 PHP
php模板函数 正则实现代码
2012/10/15 PHP
php教程之phpize使用方法
2014/02/12 PHP
PHP类的反射用法实例
2014/11/03 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
页面加载完后自动执行一个方法的js代码
2014/09/06 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
js canvas实现擦除效果示例代码
2017/04/26 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
Puppet的一些技巧
2018/09/17 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
基于jquery实现彩色投票进度条代码解析
2020/08/26 jQuery
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
Python实现telnet服务器的方法
2015/07/10 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python二维键值数组生成转json的例子
2019/12/06 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
电气技术员岗位职责
2013/11/19 职场文书
美德好少年事迹材料
2014/01/19 职场文书
工作说明书范文
2014/05/07 职场文书
新品发布会策划方案
2014/06/08 职场文书
好听的队名和口号
2014/06/09 职场文书
群众路线调研报告范文
2014/11/03 职场文书
事业单位岗位说明书
2015/10/08 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python