spring mvc 數據綁定


1、spring mvc 默認提供的數據綁定類

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;
	}

2、其中解析自定義class的為 ServletModelAttributeMethodProcessor

所有參數對應解析類如下:

RequestParamMethodArgumentResolver
處理類型:
    1、包含注解RequestParam,但不處理參數類型為Map,且不包含value值
    2、參數類型為MultipartFile,或javax.servlet.http.Part的類型
處理方式:
    1、如果參數類型為MultipartFile,返回MultipartFile
    2、如果參數類型為List<MultipartFile>,返回List<MultipartFile>
    3、如果參數類型為javax.servlet.http.Part,返回Part
    4、否則返回request.getParameter("key")
RequestParamMapMethodArgumentResolver
處理類型:
    1、參數包含RequestParam注解,且注解的value值為空,且參數類型為Map
處理方式:
    1、把parameter以map形式保存,如果value有多個值,只取第一個
PathVariableMethodArgumentResolver
處理類型:
    1、包含注解PathVariable,如果參數類型為Map,且PathVariable的value為空不處理
處理方式:
    1、根據把RequestMapping的url表達式,找到對應的值
    2、把對應的值轉換為參數類型對象
    3、以View.class.getName() + ".pathVariables" 為key,參數值為value,放入request 的Attribute中
PathVariableMapMethodArgumentResolver
處理類型:
    1、包含注解PathVariable,且參數類型為Map,且PathVariable的value為空
處理方式:
    1、返回Map形式的對象
MatrixVariableMethodArgumentResolver
處理類型:
    1、包含注解MatrixVariable,如果參數類型為Map,且MatrixVariable的value為空不處理
處理方式:
    1、把對應的值反射到參數中
例子
    // 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
處理類型:
    1、包含注解MatrixVariable,且參數類型為Map,且MatrixVariable的value為空
處理方式:
    2、生產Map
ServletModelAttributeMethodProcessor
處理類型:
    1、參數包含注解ModelAttribute
處理方式:
    1、獲取name,默認為value,如果沒有則使用參數名
    2、如果model包含了name的對象,這返回,如果沒有則創建對象,然后把request.getParameter的值反射到對象中
    3、將對象放入model中
RequestResponseBodyMethodProcessor
處理類型:
    1、參數包含注解RequestBody
處理方式:
    1、將post數據轉換成對應的對象
RequestPartMethodArgumentResolver
處理類型:
    1、包含注解RequestPart
    2、類型為MultipartFile,但是沒有注解RequestParam
    3、類型為javax.servlet.http.Part
處理方式:
    1、返回對象的類型數據
RequestHeaderMethodArgumentResolver
處理類型:
    1、包含注解RequestHeader,且類型不是Map
處理方式:
    1、返回request.getHeaderValues(name)[0]
RequestHeaderMapMethodArgumentResolver
處理類型:
    1、包含注解RequestHeader,且類型是Map
處理方式:
    1、把Heander轉換成Map
ServletCookieValueMethodArgumentResolver
處理類型:
    1、包含注解CookieValue
處理方式:
    1、找到對應的cookie,如果參數類型為Cookie則返回cookie,如果是String,返回cookie的值
ExpressionValueMethodArgumentResolver
處理類型:
    1、包含注解Value
處理方式:
ServletRequestMethodArgumentResolver
處理類型:
處理方式:
ServletResponseMethodArgumentResolver
處理類型:
    1、處理類型為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);
處理方式:
    1、返回對應類型
RedirectAttributesMethodArgumentResolver
處理類型:
    1、參數類型為RedirectAttributes
處理方式:
ModelMethodProcessor
處理類型:
    1、處理類型為Model
處理方式:
    1、返回Model
MapMethodProcessor
處理類型:
    1、處理類型為Map
處理方式:
    1、返回Model
ErrorsMethodArgumentResolver
處理類型:
    1、處理類型為Errors
處理方式:
    1、如果model沒有數據,拋出IllegalStateException異常,否則返回BindingResult
SessionStatusMethodArgumentResolver
處理類型:
    1、類型為SessionStatus
處理方式:
    1、return mavContainer.getSessionStatus();
UriComponentsBuilderMethodArgumentResolver
處理類型:
    1、類型為UriComponentsBuilder
處理方式:
    1、返回UriComponentsBuilder


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM