干什么
modelFactory 主要是维护model的,有两个作用:
- 初始化model
- 更新model,在处理器处理完了之后,把参数更新的到sessionAttributes中
初始化
在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中的invokeHandlerMethod(HttpServletRequest request,HttpServletResponse response, HandlerMethod handlerMethod)方法中调用。看一下源码
public void initModel(NativeWebRequest request, ModelAndViewContainer container,
HandlerMethod handlerMethod) throws Exception {
//取出sessionAttribute中保存的参数合并到model中
Map<String, ?> sessionAttributes = this.sessionAttributesHandler.retrieveAttributes(request);
container.mergeAttributes(sessionAttributes);
//执行注释了标记了@modelAttribute的方法
invokeModelAttributeMethods(request, container);
//看看要执行的方法,入参有没有被@modelAttribute修饰的,如果有在@sessionAttribute中找,找到给赋值,主要在创建一个 有@modelAttribute修饰的入参的name
for (String name : findSessionAttributeArguments(handlerMethod)) {
if (!container.containsAttribute(name)) {
Object value = this.sessionAttributesHandler.retrieveAttribute(request, name);
if (value == null) {
throw new HttpSessionRequiredException("Expected session attribute '" + name + "'", name);
}
container.addAttribute(name, value);
}
}
首先细说一下findSessionAttributeArguments(handlerMethod)这个方法,这个方法主要是取得被@modelAttribute标签修饰的入参的属性名
private List<String> findSessionAttributeArguments(HandlerMethod handlerMethod) {
List<String> result = new ArrayList<String>();
//取得所有的入参
for (MethodParameter parameter : handlerMethod.getMethodParameters(