zoukankan      html  css  js  c++  java
  • spirngmvc POJO参数映射详解

    DispatcherServlet中执行doDispatch()方法,首先根据映射处理器获得HandlerExecutionChain,后文详解#1

     获得处理适配器,后文详解#2

    执行目标方法,获得ModelAndView,后文详解#3

    书接前文#1

    // 使用RequestMappingHandlerMapping获得

    // AbstractHandlerMapping中获得HandlerMethod,后文详解#1-1

    // 创建对象添加一系列拦截器并返回

    书接前文#1-1

    AbstractHandlerMethodMapping中执行getHandlerInternal(request)方法

    // 获得请求路径如 /person/add

    // 根据请求路径获得HandlerMethod,后文详解#1-1-1

     // 如果HandlerMethod的bean属性是一个String而不是一个实例,那就通过getBean(beanName)获得实例。后文详解#1-1-2

    书接前文#1-1-1

    通过映射注册器根据请求路径获得RequestMappingInfo ,可参阅RequestMappingHandlerMapping初始化

    获得Match集合

    // 找到最符合的一个Match,返回其HandlerMethod

    addMatchingMappings(matches)方法内部实现

    // 遍历所有的RequestMappingInfo,根据正则匹配请求路径和patterns获得符合的RequestMappingInfo

    // matches中添加Match对象(RequestMappingInfo,HandlerMethod

     书接前文#1-1-2

    书接前文#2

     遍历所有的处理适配器

     返回RequestMappingHandlerAdapter

    书接前文#3

     RequestMappingHandlerAdapter中执行目标方法

     // 创建方法调度器

     // 创建ModelAndView容器

     // 方法调度,后文详解#3-1

     // 获得ModelAndView,后文详解#3-2

    书接前文#3-1

    参数映射,执行目标方法,返回值

     返回值处理,找到合适的返回值处理器如返回值String则找到ViewNameMethodReturnValueHandler,为ModelAndViewContainer的view属性赋值

    核心部分,POJO参数映射

     // 方法反射执行目标方法

    getMethodArgumentValues()方法内部实现

    从HandlerMethod中拿到MethodParameter

    // HandlerMethodArgumentResolverComposite判断是否有参数解析器支持解析该参数类型
    if (this.argumentResolvers.supportsParameter(parameter)) { try {
                // 拿到了ServletModelAttributeMethodProcessor解析器,处理参数 args[i] = this.argumentResolvers.resolveArgument( parameter, mavContainer, request, this.dataBinderFactory); continue; }
    }
    // 获得参数名
    String name = ModelFactory.getNameForParameter(parameter);
    // 实例化参数 Object attribute = (mavContainer.containsAttribute(name) ? mavContainer.getModel().get(name) : createAttribute(name, parameter, binderFactory, webRequest));
    // 创建数据绑定器WebRequestDataBinder,设置自定义的属性编辑器

     WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);
     if (binder.getTarget() != null) {
       if (!mavContainer.isBindingDisabled(name))

         // 将request域中的属性拿到设置到参数中
         bindRequestParameters(binder, webRequest);
     }

    ServletRequestDataBinder servletBinder = (ServletRequestDataBinder) binder;
    servletBinder.bind(servletRequest);
    // 获得request域中值
    MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
    doBind(mpvs);

    getPropertyAccessor()依旧是获得BeanWrapperImpl对象,通过方法反射设置value值

    书接前文#3-2

  • 相关阅读:
    小菜读书---《程序员修炼之道–从小工到专家》
    小菜读书--《大话设计模式》
    darknet-mini:带注释的darknet简化版,助你深入理解YOLO
    如何使用VLC进行视频录像
    海康相机打开的方法
    YOLOv5训练自己的数据集(超详细完整版)
    用GANs来做数据增强
    torch ----------->>>>rknn
    Linux下的tar压缩解压缩命令详解
    小缺陷目标检测网络--PCB缺陷检测—TDD-net
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/7452708.html
Copyright © 2011-2022 走看看