文档章节

springmvc数据绑定之@RequestParam

IceFrog
 IceFrog
发布于 2017/03/23 17:23
字数 533
阅读 35
收藏 1

主要测试@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;
	}

 

© 著作权归作者所有

IceFrog
粉丝 0
博文 25
码字总数 14169
作品 0
海淀
程序员
私信 提问
SpringMVC报错The request sent by the client was synt

SpringMVC数据绑定是一个很好的东西,在数据绑定的时候一定要主意Controller方法中的参数名和jsp页面里的参数名字是否一致或者按照绑定的规范来写,如果不一致,可能报如下错误: The reques...

RJKD
2014/04/21
72
0
Spring4.1.6 常用注解

常用的spring注解有如下几种: @Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @Resource @PostConstruct @PreDestroy @Repositor......

大糊涂
2015/06/10
183
0
4:spring mvc 数据绑定

 如何绑定数据 API方式绑定数据 我们还可以通过如HttpServletRequest 等API 得到请求数据,但推荐使用注解方式,因为使用起来更简单。我们需要首先看看功能处理方法支持哪些类型的形式参数...

小杰java
2017/10/18
21
0
SpringMVC+Spring+Mybatis整合应用(1)

以用户管理系统的开发为例,详细介绍SpringMVC+Spring+Mybatis的整合,并在编写controller的过程中记录SpringMVC中的一些高级应用(会特别标示) 1. 项目整合搭建过程 1. 项目需求:主要实现...

江左煤郎
2018/11/29
73
0
springmvc学习笔记(11)-springmvc注解开发之简单参数绑定

springmvc学习笔记(11)-springmvc注解开发之简单参数绑定 标签: springmvc [TOC] 本文主要介绍注解开发的简单参数绑定,包括简单类型、简单pojo以及自定义绑定实现类型转换 spring参数绑定过...

brianway
2016/03/12
152
0

没有更多内容

加载失败,请刷新页面

加载更多

Android面试常客之Handler全解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fnhfire_7030/article/details/79518819 前言:又到了一年...

shzwork
20分钟前
4
0
position sticky 定位

本文转载于:专业的前端网站➫position sticky 定位 1、兼容性 https://caniuse.com/#search=sticky chrome、ios和firefox兼容性良好。 2、使用场景 sticky:粘性。粘性布局。 在屏幕范围内时...

前端老手
27分钟前
4
0
CentOS 7 yum 安装 PHP7.3 教程

参考:https://www.mf8.biz/centos-rhel-install-php7-3/ 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release......

dragon_tech
42分钟前
4
0
Linux物理网卡聚合及桥接

Linux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表...

xiangyunyan
42分钟前
4
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

猿敲月下码
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部