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中Collection的一些常用方法总结
Jun 13 Java/Android
基于Java的MathML转图片的方法(示例代码)
Jun 23 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
使用springMVC所需要的pom配置
Sep 15 Java/Android
springboot应用服务启动事件的监听实现
Apr 06 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
SpringBoot 集成短信和邮件 以阿里云短信服务为例
Apr 22 Java/Android
Java 定时任务技术趋势简介
May 04 Java/Android
Android studio 简单计算器的编写
May 20 Java/Android
Android Studio实现带三角函数对数运算功能的高级计算器
May 20 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
8个PHP程序员常用的功能汇总
2014/12/18 PHP
php截取中文字符串函数实例
2015/02/23 PHP
php从给定url获取文件扩展名的方法
2015/03/14 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
python远程登录代码
2008/04/29 Python
flask中使用SQLAlchemy进行辅助开发的代码
2013/02/10 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
结束运行python的方法
2020/06/16 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
python批量修改文件名的示例
2020/09/27 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
医药专业推荐信
2013/11/15 职场文书
个人教师自我评价范文
2013/12/02 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
艺术节开幕词
2015/01/28 职场文书
第一军规观后感
2015/06/12 职场文书
团队拓展训练感想
2015/08/07 职场文书
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server