网络知识 娱乐 Spring Boot之请求方式与请求映射过程分析

Spring Boot之请求方式与请求映射过程分析

Spring Boot支持Rest风格:使用HTTP请求方式的动词来表示对资源的操作

非Rest风格

以前这样写接口:

/getUser 获取用户 n/deleteUser 删除用户 n/updateUser 修改用户 n/saveUser 保存用户n

t@RequestMapping(value = "/getUser", method = RequestMethod.GET)n public String getUser() {n return "GET";n }nn @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)n public String deleteUser() {n return "POST";n }n n @RequestMapping(value = "/updateUser", method = RequestMethod.POST)n public String updateUser() {n return "POST";n }n n @RequestMapping(value = "/saveUser", method = RequestMethod.POST)n public String saveUser() {n return "POST";n }n

使用Rest风格

使用Rest风格,则这样写接口:

/user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户n

@GetMapping("/user")n public String getUser() {n return "GET";n }nn @PostMapping("/user")n public String saveUser() {n return "POST";n }nn @PutMapping("/user")n public String putUser() {n return "PUT";n }nn @DeleteMapping("/user")n public String deleteUser() {n return "DELETE";n }n

表单提交

通过表单方式提交请求,请求类型只能支持Get与Post

若表单提交要使用REST风格,则表单请求方式使用Post,添加隐藏域 _method=put、 _method=delete方式来支持Rest风格

示例如下

<form action="/user" method="post">nt<input name="_method" type="hidden" value="delete"/>n <input value="REST提交" type="submit"/>n</form>n

SpringBoot配置文件中开启页面表单的Rest功能

spring:n mvc:n hiddenmethod:n filter:n enabled: truen

过程分析

首先是从自动配置类WebMvcAutoConfiguration开始,其中的hiddenHttpMethodFilter方法入手,请求首先被该方法拦截

Spring Boot之请求方式与请求映射过程分析

接着创建OrderedHiddenHttpMethodFilter对象,其又继承HiddenHttpMethodFilter

Spring Boot之请求方式与请求映射过程分析

HiddenHttpMethodFilter中的doFilterInternal核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method

Spring Boot之请求方式与请求映射过程分析

request.getParameter(this.methodParam)从请求中获取_method参数进行判断拦截,故可修改默认_method,自定义隐藏参数。

@Beann public HiddenHttpMethodFilter hiddenHttpMethodFilter() {n HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();n methodFilter.setMethodParam("_mymethod");n return methodFilter;n }n

请求映射过程分析

首先一个请求肯定会经过HttpServlet类的doGet()或doPost()等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:

Spring Boot之请求方式与请求映射过程分析

推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet类的doGet()方法

Spring Boot之请求方式与请求映射过程分析

processRequest方法又调用了doService方法

Spring Boot之请求方式与请求映射过程分析

doService方法是一个接口,FrameworkServlet并没有具体实现

Spring Boot之请求方式与请求映射过程分析

不过DispatcherServlet对其经行了具体实现,doService方法中又调用doDispatch核心请求分发方法

Spring Boot之请求方式与请求映射过程分析

doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)

Spring Boot之请求方式与请求映射过程分析

Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求

Spring Boot之请求方式与请求映射过程分析

在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则

如下:某Controller层的/index请求方法就与RequestMappingHandlerMapping进行了关联绑定

Spring Boot之请求方式与请求映射过程分析

接着再执行mapping.getHandler(request)

Spring Boot之请求方式与请求映射过程分析

执行this.getHandlerInternal(request),来到AbstractHandlerMethodMapping类重写的方法

Spring Boot之请求方式与请求映射过程分析

执行 super.getHandlerInternal(request);得到当前请求Path

Spring Boot之请求方式与请求映射过程分析

执行this.lookupHandlerMethod(lookupPath, request);进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。

Spring Boot之请求方式与请求映射过程分析

到此,Spring Boot的请求映射过程解析完毕。最终,请求映射过程中涉及的类如下:

Spring Boot之请求方式与请求映射过程分析

原文出处:https://juejin.cn/post/7112070118732988430

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

学习更多JAVA知识与技巧,关注与私信博主(555)

Spring Boot之请求方式与请求映射过程分析