使用自定义类作为参数的处理

##介绍##

作为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);

方法二:

  1. 定义类

    public class PageParam{ private int start=0; private int limit=20;

     //....setter
     //....getter	
    

    }

  2. 使用方法

     void methodName(PageParam parmas);
    

     void methodName(@ModelAttribute PageParam parmas);
    

##示例说明##

很显然是@ModelAttribute的效果.我们通过源码可知@ModelAttribute的处理器类是ModelAttributeMethodProcessor. 根据在RequestMappingHandlerAdapter中默认注册的new ServletModelAttributeMethodProcessor(true),我们可以知道:

  1. 这个处理器注册在最后,别的处理器(包括我们自定义的参数解析器)走完之后才会走这里.(所以会有一些捡破烂的操作,你们不要的都由我来).
  2. 不论有没有加@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;
	}
}

##打完收工##

综上:

  1. 我们可以放心的使用自定义类型作为参数,方便重复利用.不然每次都要写一大堆基本类型
  2. 如果自定义类型比较简单的话,ModelAttributeMethodProcessor会自动进行处理,不用担心没有值.
  3. 如果自定义类型比较复杂或者名字压根就和浏览器发过来的参数不对应.这时我们要增加自定义参数解析器进行处理.ModelAttributeMethodProcessor不会影响我们自定义的解析器,因为我们在它前面.

转载于:https://my.oschina.net/huanger/blog/361854

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值