1. restful风格
参数有很多种形式,比如常见的”?”后面的参数,以及rest风格
1.1 rest的使用与原理(rest需要配置文件中开启)
rest风格是啥?
rest并不是把&变成了 / ,而是同一个请求根据提交方式的不同,有不同的响应
可以同一个请求(如/user),根据提交方式(get、post、delete、put)的不同,得到不同的处理
rest使用:表单提交,_method、RequestMethod.PUT、开启配置
首先表单里并没有 Delete、Put这种提交方式(只有get、post),怎么办?
control层
原理是什么?WebMvcAutoConfiguration的hiddenHttpMethodFilter()
测试代码
总结:
首先,表单提交过来,经过 WebMVCAutoConfiguration类的hiddenHttpMethodFilter()方法拦截,返回一个新的Filter。(中间经历了很多过程,点进去这个构造器查看这个过程)
然后doFilterInternal()里的filterChain放行requestToUser(实际上已经从resquest变成了requestWrapper),即request经过了包装。所以以后的方法调用getMethod(),是调用wrapper的getMethod()
总结2:客户端提交
即request请求进来,经过了很多处理,其中包括对其包装,把原有的post值改成_method对应的值。然后经过doFilter链一直传递给controller
额外:怎么把 _method改成我们喜欢的值呢?重写hiddenHttpMethodFilter方法
本质上springboot默认实现也是创建一个 HiddenHttpMethodFilter实例
2. 请求映射原理
一系列对request的处理过程,最后是交给了DispatcherServlet类的doDispatch(),所以一切请求都会调用doDispatch().DispatcherServlet的继承树HttpServletBean继承了HttpServlet,所以他是一个Servlet,但是没有重写doGet(),doPost。 找他的子类FrameworkServlet里有doGet、doPost,但是都调用了另一个方法processRequest()调用doService()处理请求。 但是FrameworkServlet里没有doService()的是实现,而仅仅是个抽象方法所以只有子类即DispatcherServlet里找doService()的实现,如下调用了doDispatch()方法去实现处理 request真正的,对request进行处理的过程。
代码分析@RequestMapping 和handler的映射规则。