invokeHandlerMethod 方法执行的细节
找到handlerMethodToInvoke
方法解析器 methodResolver
如果SessionAttribute标注的属性,在session中有值
会把这些拿来放在隐含模型中。(addAttribute)
方法解析器 methodResolver找到
getModelAttributeMethods方法(获取标注@ModelAttribute 注解的方法)
attributeMethodToInvoke:找到要执行的方法
rosolveHandlerArgument
先确定ModelAttribute方法执行时,每一个参数的值。
隐含模型有什么用?
先进来看。
拿到这方法的参数类型 parametertypes
是个map
然后创建一个Object类型的数组。参数有多少个,Object类型的数组就有多少个。
看这个目标方法参数有没有注解。有注解就遍历,解析,保存。
如果注解是requestparam,把值给paramname
required属性的值给required,defalutValue属性的值。
如果注解解析成功了,注解++
如果找到注解个数大于1
会抛异常。
打个比方就是 PathVariable和ModelAttribute的注解不能同时标。
如果注解没有找到,
resolveCommonArugument 解析普通参数
确定当前参数是否是原生api
参数类型:map
是不是servlet request对象,跟request没有一点关系。
再来判断你这个类型是不是servletResponse对象。
也不是session
判断你这个参数是不是map旗下的或者model旗下的
如果是的话,就给隐含模型赋值给你。
赋值完返回。
下面把这个方法 makeAccessible,变得可访问的
调用这个要执行方法的invoke,就是反射执行
提前运行modelAttribute