为了验证文件绑定我们需要先做以下工作:
- 把
commons-fileupload-1.3.1.jar
和commons-io-2.2.jar
两个jar包添加到我们项目。
其中maxUploadSize
用于限制上传文件的最大大小,也可以不做设置,这样就代表上传文件的大小木有限制。defaultEncoding
用于设置上传文件的编码格式,用于解决上传的文件中文名乱码问题。
下面就看具体如何使用:
添加一个DataBindController
,里面有2个paramBind
的action分别对应get和post请求:
@Controller
@RequestMapping(value = "databind")
public class ParamBindController {
@GetMapping(value="test")
@ResponseBody
public String requestbodybind(String name,int age){
return name + ">>>>" + age;
}
@RequestMapping(value="parambind", method = {RequestMethod.GET})
public ModelAndView paramBind(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("parambind");
return modelAndView;
}
@RequestMapping(value="parambind", method = {RequestMethod.POST})
public ModelAndView paramBind(HttpServletRequest request,
@RequestParam("urlParam") String urlParam,
@RequestParam("formParam") String formParam,
@RequestParam("formFile") MultipartFile formFile){
//如果不用注解自动绑定,我们还可以像下面一样手动获取数据
String urlParam1 = ServletRequestUtils.getStringParameter(request, "urlParam", null);
String formParam1 = ServletRequestUtils.getStringParameter(request, "formParam", null);
MultipartFile formFile1 = ((MultipartHttpServletRequest) request).getFile("formFile");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("urlParam", urlParam);
modelAndView.addObject("formParam", formParam);
modelAndView.addObject("formFileName", formFile.getOriginalFilename());
modelAndView.addObject("urlParam1", urlParam1);
modelAndView.addObject("formParam1", formParam1);
modelAndView.addObject("formFileName1", formFile1.getOriginalFilename());
modelAndView.setViewName("parambindresult");
return modelAndView;
}
@RequestMapping(value="doUpload", method = {RequestMethod.POST})
@ResponseBody
public String doUpload(
@RequestParam("file") MultipartFile formFile){
return formFile.getOriginalFilename();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
自动绑定数据:<br/><br/>
${urlParam}<br/>
${formParam}<br/>
${formFileName}<br/><br/><br/><br/>
手动获取数据:<br/><br/>
${urlParam1}<br/>
${formParam1}<br/>
${formFileName1}<br/>
</body>
</html>
运行项目,输入内容,选择上传文件:
在上面代码中,一般情况下@RequestParam
不加,方法参数也一样能获取对应绑定的数据,所以很多人都认为@RequestParam
是可加可不加的。直到
后来才了解到,Java的反射机制生成的对象并不会保存包含方法的参数,即参数名不会保留在class文件中,所以spring不能反射绑定。
那么问题来了,为什么我们平时都能绑定呢?
这是因为,在Debug模式开启情况下,就能绑定,而我们一般用的eclipse都是默认开启的。Debug模式下之所以能够绑定,是因为在project–>Properties–>Java Compiler
里选中了Add variable attributes to generated class files(used by the debugger)
。要知道,开启Debug模式会影响性能的,所以正式上线的时候,都会关掉的,如果我们没加的话就会报以下错误:
Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….
</div>
为了验证文件绑定我们需要先做以下工作:
- 把
commons-fileupload-1.3.1.jar
和commons-io-2.2.jar
两个jar包添加到我们项目。
其中maxUploadSize
用于限制上传文件的最大大小,也可以不做设置,这样就代表上传文件的大小木有限制。defaultEncoding
用于设置上传文件的编码格式,用于解决上传的文件中文名乱码问题。
下面就看具体如何使用:
添加一个DataBindController
,里面有2个paramBind
的action分别对应get和post请求:
@Controller
@RequestMapping(value = "databind")
public class ParamBindController {
@GetMapping(value="test")
@ResponseBody
public String requestbodybind(String name,int age){
return name + ">>>>" + age;
}
@RequestMapping(value="parambind", method = {RequestMethod.GET})
public ModelAndView paramBind(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("parambind");
return modelAndView;
}
@RequestMapping(value="parambind", method = {RequestMethod.POST})
public ModelAndView paramBind(HttpServletRequest request,
@RequestParam("urlParam") String urlParam,
@RequestParam("formParam") String formParam,
@RequestParam("formFile") MultipartFile formFile){
//如果不用注解自动绑定,我们还可以像下面一样手动获取数据
String urlParam1 = ServletRequestUtils.getStringParameter(request, "urlParam", null);
String formParam1 = ServletRequestUtils.getStringParameter(request, "formParam", null);
MultipartFile formFile1 = ((MultipartHttpServletRequest) request).getFile("formFile");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("urlParam", urlParam);
modelAndView.addObject("formParam", formParam);
modelAndView.addObject("formFileName", formFile.getOriginalFilename());
modelAndView.addObject("urlParam1", urlParam1);
modelAndView.addObject("formParam1", formParam1);
modelAndView.addObject("formFileName1", formFile1.getOriginalFilename());
modelAndView.setViewName("parambindresult");
return modelAndView;
}
@RequestMapping(value="doUpload", method = {RequestMethod.POST})
@ResponseBody
public String doUpload(
@RequestParam("file") MultipartFile formFile){
return formFile.getOriginalFilename();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
自动绑定数据:<br/><br/>
${urlParam}<br/>
${formParam}<br/>
${formFileName}<br/><br/><br/><br/>
手动获取数据:<br/><br/>
${urlParam1}<br/>
${formParam1}<br/>
${formFileName1}<br/>
</body>
</html>
运行项目,输入内容,选择上传文件:
在上面代码中,一般情况下@RequestParam
不加,方法参数也一样能获取对应绑定的数据,所以很多人都认为@RequestParam
是可加可不加的。直到
后来才了解到,Java的反射机制生成的对象并不会保存包含方法的参数,即参数名不会保留在class文件中,所以spring不能反射绑定。
那么问题来了,为什么我们平时都能绑定呢?
这是因为,在Debug模式开启情况下,就能绑定,而我们一般用的eclipse都是默认开启的。Debug模式下之所以能够绑定,是因为在project–>Properties–>Java Compiler
里选中了Add variable attributes to generated class files(used by the debugger)
。要知道,开启Debug模式会影响性能的,所以正式上线的时候,都会关掉的,如果我们没加的话就会报以下错误:
Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….
</div>