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 相关文章推荐
手把手教你用SpringBoot将文件打包成zip存放或导出
Jun 11 Java/Android
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
教你用Java在个人电脑上实现微信扫码支付
Jun 13 Java/Android
Java Optional<Foo>转换成List<Bar>的实例方法
Jun 20 Java/Android
浅谈resultMap的用法及关联结果集映射
Jun 30 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
Java Lambda表达式常用的函数式接口
Apr 07 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
Java实现添加条码或二维码到Word文档
Jun 01 Java/Android
Java实现简单小画板
Jun 10 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 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
Thinkphp模板中截取字符串函数简介
2014/06/17 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
js页面跳转的问题(跳转到父页面、最外层页面、本页面)
2013/08/14 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
JS监听滚动和id自动定位滚动
2018/12/18 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
MySQL适配器PyMySQL详解
2017/09/20 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
俄罗斯旅游网站:Tripadvisor俄罗斯
2017/03/21 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
什么是设计模式
2012/06/17 面试题
大学生求职中的自我评价
2013/10/01 职场文书
工厂厂长的职责
2013/12/12 职场文书
高中生自我评语大全
2014/01/19 职场文书
2014两会学习心得:时代的发展
2014/03/17 职场文书
拖欠货款起诉状
2015/05/20 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书
Mysql 如何查询时间段交集
2021/06/08 MySQL
python实现学生信息管理系统(面向对象)
2022/06/05 Python
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript