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