springmvc数据绑定之@RequestParam

主要测试@RequestParam是怎么接收参数的,经测试,RequestParam注解可以帮助我们接收一些复杂数据类型,集合、数组、文件类型和基本的数据类型(包含包装类)。

1、测试接收List,Array

<script type="text/javascript">
$(document).ready(function(){
	var $array = new Array();
	$array.push(0);
	$array.push(1);
	$array.push(2);
	$.ajax({
		url:'${project_name}/springmvc/hello',
		type:'post',
		data:{'ids':$array,'name':'wang'},
		success:function(data){
			
		}
	
	});
})
</script>
//接收集合	
@RequestMapping("/hello")
	public void hello(@RequestParam(value="ids[]")List<Integer> ids,String name ,HttpServletResponse response) throws Exception{
		response.getWriter().write("success");
	}
	
//接收数组
	@RequestMapping("/hello")
	public void hello(@RequestParam(value="ids[]") int[] ids,String name ,HttpServletResponse response) throws Exception{
		response.getWriter().write("success");
	}

2、测试接收文件,测试文件,用的是MultipartFile类型,所以要添加MultipartFileResolver的bean,否则要报错:Expected MultipartHttpServletRequest: is a MultipartResolver configured?,如下是配置:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
<!-- enctype="multipart/form-data"是必须的,也必须post提交-->
<form action="springmvc/file" method="post" enctype="multipart/form-data">

<input type="file" name="file"  />
<input type="file" name="file"  />
<input type="submit" value="提交"/>
</form>
	//上传多个文件
@RequestMapping("/files")
	public void files(@RequestParam(value="file") List<MultipartFile> file,String name ,MultipartHttpServletRequest request, HttpServletResponse response) throws Exception{
		response.getWriter().write("success");
	}
//上传单个文件
	@RequestMapping("/file")
	public void file(@RequestParam MultipartFile file,String name ,MultipartHttpServletRequest request, HttpServletResponse response) throws Exception{
		response.getWriter().write("success");
	}
	

以下是RequestParamMethodArgumentResolver解析参数的过程:

1、首先判断接收的参数是不是MultipartFile类型

2、判断是不是List<MultipartFile>或者Collection<MultipartFile>类型

3、判断是不是匹配“javax.servlet.http.Part”,可以通过servletRequest.getPart()来获取参数

4、如果arg还为null,则从multipartRequest获取所有文件信息

5、arg仍然为null,则获取获取List,包装类,基本数据类型的参数,最终返回arg。

protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest webRequest) throws Exception {

		Object arg;

		HttpServletRequest servletRequest = webRequest.getNativeRequest(HttpServletRequest.class);
		MultipartHttpServletRequest multipartRequest =
			WebUtils.getNativeRequest(servletRequest, MultipartHttpServletRequest.class);
        //单个文件
		if (MultipartFile.class.equals(parameter.getParameterType())) {
			assertIsMultipartRequest(servletRequest);
			Assert.notNull(multipartRequest, "Expected MultipartHttpServletRequest: is a MultipartResolver configured?");
			arg = multipartRequest.getFile(name);
		}
//多个文件
		else if (isMultipartFileCollection(parameter)) {
			assertIsMultipartRequest(servletRequest);
			Assert.notNull(multipartRequest, "Expected MultipartHttpServletRequest: is a MultipartResolver configured?");
			arg = multipartRequest.getFiles(name);
		}
		else if ("javax.servlet.http.Part".equals(parameter.getParameterType().getName())) {
			assertIsMultipartRequest(servletRequest);
			arg = servletRequest.getPart(name);
		}
		else {
			arg = null;
//多个文件
			if (multipartRequest != null) {
				List<MultipartFile> files = multipartRequest.getFiles(name);
				if (!files.isEmpty()) {
					arg = (files.size() == 1 ? files.get(0) : files);
				}
			}
			if (arg == null) {
//出文件之外的参数,通过参数的个数来判断是否为集合
				String[] paramValues = webRequest.getParameterValues(name);
				if (paramValues != null) {
					arg = paramValues.length == 1 ? paramValues[0] : paramValues;
				}
			}
		}

		return arg;
	}

 

转载于:https://my.oschina.net/u/2527296/blog/865699

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值