一、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