版权声明:本文为博主原创文章,未经博主允许不得转载。讨论交流群:59116211 https://blog.csdn.net/hao474798383/article/details/82620936
今天看到这么一段代码:
java:
@RequestMapping(....)
public ModelAndView xxx(Page page){
.....
return mv;
}
jsp:
<html>
...
${page.curentPage}
...
</html>
在handler中, 把page当做参数操作了, 但是并没有在mv对象中addObject("page", page), 但是在页面上确实是可以使用一个叫做page名称的引用
百思不得姐
debug查看源码:
1.首先进入核心servlet: dispatchServlet, 找到如下代码
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
这段代码是处理所有请求的 F5进去, 一直进到下面的类:
RequestMappingHandlerAdapter:handleInternal()
->
RequestMappingHandlerAdapter:invokeHandlerMethod()
invokeHandlerMethod() 这个方法是处理请求的核心类
一路F6 找到
invokeAndHandle()
ServletInvocableHandlerMethod:invokeAndHandle()
在这个方法上, 可以看到一个参数
ModelAndViewContainer mavContainer
这个参数在上面的invokeHandlerMethod()方法初始化, 并一路透传过来
F5到
invokeForRequest()
InvocableHandlerMethod:invokeForRequest()
这个方法首先拿到handler的参数列表,F5进入到这个方法, 一切疑惑都将解开
Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
进入这个方法之后会看到对参数绑定的一些操作
然后看到这段代码, F5进去
args[i] = this.argumentResolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
->
ModelAttributeMethodProcessor:resolveArgument()
Map<String, Object> bindingResultModel = binder.getBindingResult().getModel(); mavContainer.removeAttributes(bindingResultModel); mavContainer.addAllAttributes(bindingResultModel);
这段代码是把参数set到mavContainer 这个引用中
返回
ServletInvocableHandlerMethod:invokeAndHandle():
this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
这个方法会把mavContainer里的defaultModel 与 hanler返回的model合并
--------------------------------------到此结束--------------------------------------