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 Nio使用NioSocket客户端与服务端交互实现方式
Jun 15 Java/Android
总结一下关于在Java8中使用stream流踩过的一些坑
Jun 24 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
swagger如何返回map字段注释
Jul 03 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
MyBatis-Plus 批量插入数据的操作方法
Sep 25 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
Nov 02 Java/Android
maven依赖的version声明控制方式
Jan 18 Java/Android
java协程框架quasar和kotlin中的协程对比分析
Feb 24 Java/Android
Java中的Kotlin 内部类原理
Jun 16 Java/Android
springboot创建的web项目整合Quartz框架的项目实践
Jun 21 Java/Android
IDEA中sout快捷键无效问题的解决方法
Jul 23 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
常用PHP数组排序函数归纳
2016/08/08 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
文章或博客自动生成章节目录索引(支持三级)的实现代码
2020/05/10 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python2实现的LED大数字显示效果示例
2017/09/04 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
如何使用selenium和requests组合实现登录页面
2020/02/03 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
运动会获奖感言
2014/02/11 职场文书
小学教学随笔感言
2014/02/26 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
中央空调节能方案
2014/06/15 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL