1. restful风格

参数有很多种形式,比如常见的”?”后面的参数,以及rest风格

1.1 rest的使用与原理(rest需要配置文件中开启)

rest风格是啥?

rest并不是把&变成了 / ,而是同一个请求根据提交方式的不同,有不同的响应

可以同一个请求(如/user),根据提交方式(get、post、delete、put)的不同,得到不同的处理3.restful风格、请求映射原理、各种参数注解 - 图2

rest使用:表单提交,_method、RequestMethod.PUT、开启配置

首先表单里并没有 Delete、Put这种提交方式(只有get、post),怎么办?
3.restful风格、请求映射原理、各种参数注解 - 图3

control层

3.restful风格、请求映射原理、各种参数注解 - 图4

原理是什么?WebMvcAutoConfiguration的hiddenHttpMethodFilter()

3.restful风格、请求映射原理、各种参数注解 - 图53.restful风格、请求映射原理、各种参数注解 - 图63.restful风格、请求映射原理、各种参数注解 - 图73.restful风格、请求映射原理、各种参数注解 - 图83.restful风格、请求映射原理、各种参数注解 - 图9

测试代码

点击put,发现成功3.restful风格、请求映射原理、各种参数注解 - 图103.restful风格、请求映射原理、各种参数注解 - 图11

总结:3.restful风格、请求映射原理、各种参数注解 - 图12

首先,表单提交过来,经过 WebMVCAutoConfiguration类的hiddenHttpMethodFilter()方法拦截,返回一个新的Filter。(中间经历了很多过程,点进去这个构造器查看这个过程)3.restful风格、请求映射原理、各种参数注解 - 图133.restful风格、请求映射原理、各种参数注解 - 图143.restful风格、请求映射原理、各种参数注解 - 图153.restful风格、请求映射原理、各种参数注解 - 图16

3.restful风格、请求映射原理、各种参数注解 - 图17
3.restful风格、请求映射原理、各种参数注解 - 图18然后doFilterInternal()里的filterChain放行requestToUser(实际上已经从resquest变成了requestWrapper),即request经过了包装。所以以后的方法调用getMethod(),是调用wrapper的getMethod()3.restful风格、请求映射原理、各种参数注解 - 图19

总结2:客户端提交

即request请求进来,经过了很多处理,其中包括对其包装,把原有的post值改成_method对应的值。然后经过doFilter链一直传递给controller3.restful风格、请求映射原理、各种参数注解 - 图203.restful风格、请求映射原理、各种参数注解 - 图213.restful风格、请求映射原理、各种参数注解 - 图22

额外:怎么把 _method改成我们喜欢的值呢?重写hiddenHttpMethodFilter方法

本质上springboot默认实现也是创建一个 HiddenHttpMethodFilter实例3.restful风格、请求映射原理、各种参数注解 - 图233.restful风格、请求映射原理、各种参数注解 - 图243.restful风格、请求映射原理、各种参数注解 - 图25

2. 请求映射原理

一系列对request的处理过程,最后是交给了DispatcherServlet类的doDispatch(),所以一切请求都会调用doDispatch().DispatcherServlet的继承树3.restful风格、请求映射原理、各种参数注解 - 图26HttpServletBean继承了HttpServlet,所以他是一个Servlet,但是没有重写doGet(),doPost。 找他的子类3.restful风格、请求映射原理、各种参数注解 - 图27FrameworkServlet里有doGet、doPost,但是都调用了另一个方法3.restful风格、请求映射原理、各种参数注解 - 图28processRequest()调用doService()处理请求。 但是FrameworkServlet里没有doService()的是实现,而仅仅是个抽象方法3.restful风格、请求映射原理、各种参数注解 - 图293.restful风格、请求映射原理、各种参数注解 - 图30所以只有子类即DispatcherServlet里找doService()的实现,如下调用了doDispatch()方法去实现处理 request3.restful风格、请求映射原理、各种参数注解 - 图313.restful风格、请求映射原理、各种参数注解 - 图32真正的,对request进行处理的过程。3.restful风格、请求映射原理、各种参数注解 - 图33
代码分析3.restful风格、请求映射原理、各种参数注解 - 图343.restful风格、请求映射原理、各种参数注解 - 图353.restful风格、请求映射原理、各种参数注解 - 图363.restful风格、请求映射原理、各种参数注解 - 图373.restful风格、请求映射原理、各种参数注解 - 图38@RequestMapping 和handler的映射规则。 3.restful风格、请求映射原理、各种参数注解 - 图393.restful风格、请求映射原理、各种参数注解 - 图403.restful风格、请求映射原理、各种参数注解 - 图41