##介绍##
作为spring mvc的handler的方法可以享受到spring mvc的参数自动解析注入功能. 比如说用@RequestParam
或者@PathVariable
等注解.使用这些注解的参数一般都是基本类型,字符串,整形,长整形之类的. 当然我们也可以使用自定义类型作为参数.
##示例##
比如我们做分页,浏览器传递了start,limit参数到后台.我们有两种接收方法.
方法一:
void methodName(@RequestParam(value="start",default="0")int start,@RequestParam(value="limit",default="20")int limit);
方法二:
-
定义类
public class PageParam{ private int start=0; private int limit=20;
//....setter //....getter
}
-
使用方法
void methodName(PageParam parmas);
或
void methodName(@ModelAttribute PageParam parmas);
##示例说明##
很显然是@ModelAttribute
的效果.我们通过源码可知@ModelAttribute
的处理器类是ModelAttributeMethodProcessor
. 根据在RequestMappingHandlerAdapter
中默认注册的new ServletModelAttributeMethodProcessor(true)
,我们可以知道:
- 这个处理器注册在最后,别的处理器(包括我们自定义的参数解析器)走完之后才会走这里.(所以会有一些捡破烂的操作,你们不要的都由我来).
- 不论有没有加
@ModelAttribute
都会被处理. 原因:构造器传入了true,所以方法签名中的参数加不加@ModelAttribute
都会被它进行处理.
看看代码吧:
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(ModelAttribute.class)) {
return true;
}
else if (this.annotationNotRequired) { //有没有annotation无所谓
// 看到了吧,所有不是简单类型的都给我处理
return !BeanUtils.isSimpleProperty(parameter.getParameterType());
}
else {
return false;
}
}
##打完收工##
综上:
- 我们可以放心的使用自定义类型作为参数,方便重复利用.不然每次都要写一大堆基本类型
- 如果自定义类型比较简单的话,
ModelAttributeMethodProcessor
会自动进行处理,不用担心没有值. - 如果自定义类型比较复杂或者名字压根就和浏览器发过来的参数不对应.这时我们要增加自定义参数解析器进行处理.
ModelAttributeMethodProcessor
不会影响我们自定义的解析器,因为我们在它前面.