springMVC 入参绑定model疑惑小记

版权声明:本文为博主原创文章,未经博主允许不得转载。讨论交流群: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合并

--------------------------------------到此结束--------------------------------------

猜你喜欢

转载自blog.csdn.net/hao474798383/article/details/82620936