spring mvc 数据绑定

一、spring mvc 默认提供的数据绑定类java

private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {
		List<HandlerMethodArgumentResolver> resolvers = new ArrayList<HandlerMethodArgumentResolver>();

		// Annotation-based argument resolution
		resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));
		resolvers.add(new RequestParamMapMethodArgumentResolver());
		resolvers.add(new PathVariableMethodArgumentResolver());
		resolvers.add(new PathVariableMapMethodArgumentResolver());
		resolvers.add(new MatrixVariableMethodArgumentResolver());
		resolvers.add(new MatrixVariableMapMethodArgumentResolver());
		resolvers.add(new ServletModelAttributeMethodProcessor(false));
		resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters()));
		resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));
		resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
		resolvers.add(new RequestHeaderMapMethodArgumentResolver());
		resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
		resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));

		// Type-based argument resolution
		resolvers.add(new ServletRequestMethodArgumentResolver());
		resolvers.add(new ServletResponseMethodArgumentResolver());
		resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));
		resolvers.add(new RedirectAttributesMethodArgumentResolver());
		resolvers.add(new ModelMethodProcessor());
		resolvers.add(new MapMethodProcessor());
		resolvers.add(new ErrorsMethodArgumentResolver());
		resolvers.add(new SessionStatusMethodArgumentResolver());
		resolvers.add(new UriComponentsBuilderMethodArgumentResolver());

		// Custom arguments
		if (getCustomArgumentResolvers() != null) {
			resolvers.addAll(getCustomArgumentResolvers());
		}

		// Catch-all
		resolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));
		resolvers.add(new ServletModelAttributeMethodProcessor(true));

		return resolvers;
	}

二、其中解析自定义class的为 ServletModelAttributeMethodProcessorspring

全部参数对应解析类以下:cookie

RequestParamMethodArgumentResolver
处理类型:
    一、包含注解RequestParam,但不处理参数类型为Map,且不包含value值
    二、参数类型为MultipartFile,或javax.servlet.http.Part的类型
处理方式:
    一、若是参数类型为MultipartFile,返回MultipartFile
    二、若是参数类型为List<MultipartFile>,返回List<MultipartFile>
    三、若是参数类型为javax.servlet.http.Part,返回Part
    四、不然返回request.getParameter("key")
RequestParamMapMethodArgumentResolver
处理类型:
    一、参数包含RequestParam注解,且注解的value值为空,且参数类型为Map
处理方式:
    一、把parameter以map形式保存,若是value有多个值,只取第一个
PathVariableMethodArgumentResolver
处理类型:
    一、包含注解PathVariable,若是参数类型为Map,且PathVariable的value为空不处理
处理方式:
    一、根据把RequestMapping的url表达式,找到对应的值
    二、把对应的值转换为参数类型对象
    三、以View.class.getName() + ".pathVariables" 为key,参数值为value,放入request 的Attribute中
PathVariableMapMethodArgumentResolver
处理类型:
    一、包含注解PathVariable,且参数类型为Map,且PathVariable的value为空
处理方式:
    一、返回Map形式的对象
MatrixVariableMethodArgumentResolver
处理类型:
    一、包含注解MatrixVariable,若是参数类型为Map,且MatrixVariable的value为空不处理
处理方式:
    一、把对应的值反射到参数中
例子
    // GET /owners/42;q=11/pets/21;q=22
    @RequestMapping(value = "/owners/{ownerId}/pets/{petId}", method = RequestMethod.GET)
    public void findPet(
        @MatrixVariable(value="q", pathVar="ownerId") int q1,
        @MatrixVariable(value="q", pathVar="petId") int q2) {    
      // q1 == 11
      // q2 == 22
    }
MatrixVariableMapMethodArgumentResolver
处理类型:
    一、包含注解MatrixVariable,且参数类型为Map,且MatrixVariable的value为空
处理方式:
    二、生产Map
ServletModelAttributeMethodProcessor
处理类型:
    一、参数包含注解ModelAttribute
处理方式:
    一、获取name,默认为value,若是没有则使用参数名
    二、若是model包含了name的对象,这返回,若是没有则建立对象,而后把request.getParameter的值反射到对象中
    三、将对象放入model中
RequestResponseBodyMethodProcessor
处理类型:
    一、参数包含注解RequestBody
处理方式:
    一、将post数据转换成对应的对象
RequestPartMethodArgumentResolver
处理类型:
    一、包含注解RequestPart
    二、类型为MultipartFile,可是没有注解RequestParam
    三、类型为javax.servlet.http.Part
处理方式:
    一、返回对象的类型数据
RequestHeaderMethodArgumentResolver
处理类型:
    一、包含注解RequestHeader,且类型不是Map
处理方式:
    一、返回request.getHeaderValues(name)[0]
RequestHeaderMapMethodArgumentResolver
处理类型:
    一、包含注解RequestHeader,且类型是Map
处理方式:
    一、把Heander转换成Map
ServletCookieValueMethodArgumentResolver
处理类型:
    一、包含注解CookieValue
处理方式:
    一、找到对应的cookie,若是参数类型为Cookie则返回cookie,若是是String,返回cookie的值
ExpressionValueMethodArgumentResolver
处理类型:
    一、包含注解Value
处理方式:
ServletRequestMethodArgumentResolver
处理类型:
处理方式:
ServletResponseMethodArgumentResolver
处理类型:
    一、处理类型为WebRequest.class.isAssignableFrom(paramType) ||
                ServletRequest.class.isAssignableFrom(paramType) ||
                MultipartRequest.class.isAssignableFrom(paramType) ||
                HttpSession.class.isAssignableFrom(paramType) ||
                Principal.class.isAssignableFrom(paramType) ||
                Locale.class.equals(paramType) ||
                InputStream.class.isAssignableFrom(paramType) ||
                Reader.class.isAssignableFrom(paramType);
处理方式:
    一、返回对应类型
RedirectAttributesMethodArgumentResolver
处理类型:
    一、参数类型为RedirectAttributes
处理方式:
ModelMethodProcessor
处理类型:
    一、处理类型为Model
处理方式:
    一、返回Model
MapMethodProcessor
处理类型:
    一、处理类型为Map
处理方式:
    一、返回Model
ErrorsMethodArgumentResolver
处理类型:
    一、处理类型为Errors
处理方式:
    一、若是model没有数据,抛出IllegalStateException异常,不然返回BindingResult
SessionStatusMethodArgumentResolver
处理类型:
    一、类型为SessionStatus
处理方式:
    一、return mavContainer.getSessionStatus();
UriComponentsBuilderMethodArgumentResolver
处理类型:
    一、类型为UriComponentsBuilder
处理方式:
    一、返回UriComponentsBuildermvc

相关文章
相关标签/搜索