您的位置:首页 > 编程语言 > Java开发

springmvc数据绑定之@RequestParam

2017-03-23 00:00 295 查看
主要测试@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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐