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输出Hello World完美过程解析
Jun 13 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Java数组与堆栈相关知识总结
Jun 29 Java/Android
SpringBoot集成Druid连接池连接MySQL8.0.11
Jul 02 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
gateway网关接口请求的校验方式
Jul 15 Java/Android
Java SSM配置文件案例详解
Aug 30 Java/Android
JavaWeb实现显示mysql数据库数据
Mar 19 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
Java 数组的使用
May 11 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
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
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
substr()函数中文版
2006/10/09 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
php compact 通过变量创建数组
2016/11/15 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
javascript add event remove event
2008/04/07 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
three.js实现圆柱体
2018/12/30 Javascript
微信小程序的mpvue框架快速上手指南
2019/05/15 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
Python代码解决RenderView窗口not found问题
2016/08/28 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
Django组件之cookie与session的使用方法
2019/01/10 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
2014年教师节演讲稿
2014/09/03 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
个人思想政治总结
2015/03/05 职场文书
python实现简单的三子棋游戏
2022/04/28 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js