`
liyixing1
  • 浏览: 939492 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

springmvc action方法中参数具有@ModelAttribute与不具有的区别

 
阅读更多
在springmvc的参数解析中,发现具有@ModelAttribute 注解,那么最后会进入方法:

org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute

该方法的代码是:
private WebDataBinder resolveModelAttribute(String attrName, MethodParameter methodParam,
ExtendedModelMap implicitModel, NativeWebRequest webRequest, Object handler) throws Exception {

// Bind request parameter onto object...
String name = attrName;
if ("".equals(name)) {
name = Conventions.getVariableNameForParameter(methodParam);
}
Class<?> paramType = methodParam.getParameterType();
Object bindObject;
if (implicitModel.containsKey(name)) {
bindObject = implicitModel.get(name);
}
else if (this.methodResolver.isSessionAttribute(name, paramType)) {
bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name);
if (bindObject == null) {
raiseSessionRequiredException("Session attribute '" + name + "' required - not found in session");
}
}
else {
bindObject = BeanUtils.instantiateClass(paramType);
}
WebDataBinder binder = createBinder(webRequest, bindObject, name);
initBinder(handler, name, binder, webRequest);
return binder;
}

可以看到,对于这种参数,
1.如果发现modelMap中不存在这个对象,那么,会自动创建这个对象。创建完之后,进入下一步
2.如果已经存在,进入下一步。

这里的下一步处理,可以发现就算请求参数有一个名字刚好和这个参数名相同也不会处理,因为之后springmvc只会处理这个对象的子属性,而不会再次处理它自己了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics