表单支持Delete、PUT参数
为了让表单支持DELETE、PUT等参数,我们需要配置HiddenHttpMethodFilter,配置了该Bean后,表单可以增加_method的隐藏域,来支持DELETE、PUT等参数。我们可以对HiddenHttpMethodFilter进行定制:
|
|
HiddenHttpMethodFilter的原理是这样的:
- Post请求,且带有_method参数,会被HiddenHttpMethodFilter拦截
- 拦截后返回一个RequestWrapper对象,该对象的getMethod将会返回_method对应的方法
请求映射的原理
Dispatcher的doDispatch方法会找一个正确的一个Handler处理当前的请求,程序运行的过程中,有如下的Handler:
其中WelcomePageHandlerMapping可以访问index.html,RequestMappingHandlerMapping在请求进来时,挨个尝试所有的HandlerMapping看是否有请求信息。如果有就找到这个请求对应的Handler,如果没有就是尝试一个HandlerMapping。
我们可以通过给容器注入HandlerMapping,来自定义映射处理(我评估了一下,暂时没有相关需求,所以就不研究了)
在处理Controller中的方法时,我们使用RequestMappingHandlerMapping
。RequestMappingHandlerMapping
包含了当前SpringBoot实例中所有@RequestMapping和handler的映射规则:
(整理到这块,我突然意识到RequestMappingHandlerMapping和最开始的@RequestMapping注解好像啊,RequestMappingHandlerMapping应该就是@RequestMapping真实处理类)
普通参数与基本注解
基本注解有如下几个:@PathVariable、@RequestHeader、@ModleAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody,其中@PathVariable、@ModleAttribute、@MatrixVariable、@CookieValue这几个我用的比较少。
支持的Servlet参数有:WebRequest、ServletRequest、MultipartRequest、HttpSession、PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId。由ServletRequestMethodArgumentResolver提供对这些
支持的复杂参数有:Map、Model(map、model里面的数据会被放在request的请求域request.setAttribute)、Errors/BindingResult、RedirectAttributes(重定向携带数据)、ServletResponse、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder
对矩阵变量的理解
(我不想整理这部分笔记了,矩阵变量的使用概率非常的底)
对Map、Modle的理解
(这部分用的比较少了,仅记录一下)
Map、Model类型的参数,会返回mavContainer.getModel();—>BindingAwareModelMap是Model也是Map。
对自定义对象的理解
ServletModelAttributeMethodProcessor
(我们很少用对象去接受请求的参数,故此处不深入研究。)
参数处理原理
- HandlerMapping中找到能处理请求的Handler(Controller.method())
- 为当前Handler找一个适配器HandlerAdapter(RequestMappingHandlerAdapter)
- 适配器执行目标方法,并确定方法参数的每一个值
数据相应与内容协商
(暂时不整理这部分了)