zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 1082 博弈推规律
    博弈论总结
    POJ 2502 Subway 关键在建图
    【算法设计与数据结构】为何程序员喜欢将INF设置为0x3f3f3f3f?
    一位ACMer过来人的心得
    POJ1724 Dij队列优化邻接表
    Dijkstra队列优化矩阵版
    Uva247 Floyd传递闭包+map处理
    简爬新浪新闻网
    爬href链接
  • 原文地址:https://www.cnblogs.com/beiyeren/p/3548315.html
Copyright © 2011-2022 走看看