spirng 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

时间: 2024-10-10 02:22:42

spirng POJO参数映射详解的相关文章

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动)

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动) 2015-02-22 李海沿 刚刚我们实现了linux系统内存的分配,读写,释放功能,下面,我们一鼓作气将IO端口映射及IO内存映射搞定,加油! (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址

linux串口编程参数配置详解

1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函数库定义 #include <unistd.h>       //Unix标准函数定义 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>          //文件控制定义 #incl

【架构之路之ORM】--FluentNHibernate之基本映射详解

最近在做项目的时候用到了NHibernate,使用它并不困难,但是很麻烦.如果我的数据库有几百张表如果想要一个个的映射岂不是很麻烦,所以这种情况下使用NHibernate就会很笨重,虽然这个ORM框架本身功能强大,但属于重量级的在使用的时候太笨重了,所以需要在项目中改良.这时候就应运而生了FluentNHibernate,它是流畅版的NHibernate,支持所有的NHibernate功能,而且还封装了配置文件的映射功能,也就是说可以将映射使用C#代码编写,这样在维护时就会很简单. 在没有Flu

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

hibernate enum映射详解

hibernate enum映射详解 在这里介绍注解的形式,如果想要了解XML配置的方式,可以自行查找相关资料. 例如以下Entity @Entity @Table(name = "t_user") public class User implements Serializable { /** * */ private static final long serialVersionUID = -9042615274714038279L; @Id @GeneratedValue(stra

nginx一些参数配置详解

nginx的配置:    正常运行的必备配置:       1.user username [groupname];           指定运行worker进程的用户和组       2.pid /path/to/pidfile_name nginx的pid文件 3.worker_rlimit_nofile #;            一个worker进程所能够打开的最大文件句柄数:       4.worker_rlimit_sigpending #;            设定每个用户能够

【Hibernate步步为营】--组合映射详解

上篇文章详细讨论了复合主键的映射原理,对于复合主键映射需要使用<composite-id>标签来标明映射的类属性,并在该标签中添加<key-property>子标签,并且主键列需要实现序列化接口,使用很简单只要学会如何进行映射就可以实现复合映射.接下来讨论组合对象映射,组合映射关系其实是把两个对象的公共部分抽象出来形成一个对象,两个子对象会包含另一个主对像,在配置映射文件时需要使用<component>标签来标明映射关系. 一.组合映射 组合是关联关系的一种特殊情况,是

【Hibernate步步为营】--双向关联一对一映射详解(二)

很不好意思,有两天时间没有更新博客文章了,不写文章的日子还真是感觉很空洞啊,养成了写文章的恶习想改也改不掉啊.说点题外话,前两天收到一位朋友的私信,邀请笔者写一篇有关OWS的文章,用来研究图标工具的一种技术,很荣幸收到这位朋友的邀请,但是因为这几天开发的项目着急上线所以暂时没有时间去研究,只能等这周末了,利用周末的时间来研究然后更新类似的技术文章. 回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-o

Linux rpm 命令参数使用详解[介绍和应用]

RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的"添加/删除程序" rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组合: -ivh:安装显示安装进度--install--verbose--hash -Uvh:升级软件包--Update: -qpl:列出RPM软件包内的文件信息[Q