Spring MVC对请求参数处理

表单支持Delete、PUT参数

为了让表单支持DELETE、PUT等参数,我们需要配置HiddenHttpMethodFilter,配置了该Bean后,表单可以增加_method的隐藏域,来支持DELETE、PUT等参数。我们可以对HiddenHttpMethodFilter进行定制:

1
2
3
4
5
6
7
8

@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
    HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
    methodFilter.setMethodParam("_m");
    return methodFilter;
}

HiddenHttpMethodFilter的原理是这样的:

  1. Post请求,且带有_method参数,会被HiddenHttpMethodFilter拦截
  2. 拦截后返回一个RequestWrapper对象,该对象的getMethod将会返回_method对应的方法

请求映射的原理

Dispatcher的doDispatch方法会找一个正确的一个Handler处理当前的请求,程序运行的过程中,有如下的Handler:

2021-07-22-16-34-34

其中WelcomePageHandlerMapping可以访问index.html,RequestMappingHandlerMapping在请求进来时,挨个尝试所有的HandlerMapping看是否有请求信息。如果有就找到这个请求对应的Handler,如果没有就是尝试一个HandlerMapping。

我们可以通过给容器注入HandlerMapping,来自定义映射处理(我评估了一下,暂时没有相关需求,所以就不研究了)

在处理Controller中的方法时,我们使用RequestMappingHandlerMappingRequestMappingHandlerMapping包含了当前SpringBoot实例中所有@RequestMapping和handler的映射规则:

2021-07-22-16-53-52

(整理到这块,我突然意识到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

(我们很少用对象去接受请求的参数,故此处不深入研究。)

参数处理原理

  1. HandlerMapping中找到能处理请求的Handler(Controller.method())
  2. 为当前Handler找一个适配器HandlerAdapter(RequestMappingHandlerAdapter)
  3. 适配器执行目标方法,并确定方法参数的每一个值

数据相应与内容协商

(暂时不整理这部分了)