目录
请求方式
非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
方法入手,请求首先被该方法拦截
接着创建OrderedHiddenHttpMethodFilter
对象,其又继承HiddenHttpMethodFilter
HiddenHttpMethodFilter
中的doFilterInternal
核心方法进行了相关拦截操作,要求是Post请求并且请求正常,然后获取请求参数_method
request.getParameter(this.methodParam)
从请求中获取_method
参数进行判断拦截,故可修改默认_method
,自定义隐藏参数。
@Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter(); methodFilter.setMethodParam(\"_mymethod\"); return methodFilter; }
请求映射过程分析
首先一个请求肯定会经过HttpServlet
类的doGet()
或doPost()
等方法,当然不一定会执行,但其子类肯定会有对其的具体实现,其实现类如下:
推测+大概看源码得出Spring Boot的一个请求会经过FrameworkServlet
类的doGet()
方法
processRequest
方法又调用了doService方法
doService方法是一个接口,FrameworkServlet
并没有具体实现
不过DispatcherServlet
对其经行了具体实现,doService方法中又调用doDispatch
核心请求分发方法
doDispatch方法中又寻找当前请求使用哪个Handler(处理器映射器)
Spring Boot默认已配置有如下5种处理器映射器。这里会挨个尝试所有的HandlerMapping看是否有匹配的请求
在Spring Boot启动时,相关处理器映射器已经将请求关系进行了绑定,保存了所有@RequestMapping 和handler的映射规则
如下:某Controller层的/index
请求方法就与RequestMappingHandlerMapping
进行了关联绑定
接着再执行mapping.getHandler(request)
执行this.getHandlerInternal(request)
,来到AbstractHandlerMethodMapping
类重写的方法
执行 super.getHandlerInternal(request);
得到当前请求Path
执行this.lookupHandlerMethod(lookupPath, request);
进行判断当前请求的是具体那个方法,即请求对应的handler,找到后并返回。
到此,Spring Boot的请求映射过程解析完毕。
最终,请求映射过程中涉及的类如下:
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。