为了验证文件绑定我们需要先做以下工作:
1.把commons-fileupload-1.3.1.jar和commons-io-2.2.jar两个jar包添加到我们项目。
2.配置我们项目中的spring-servlet.xml文件使之支持文件上传,内容如下:
- <!-- 支持上传文件 -->
- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
- <!-- 设置上传文件的最大尺寸为1MB -->
- <property name="maxUploadSize">
- <value>1048576</value>
- </property>
- <property name="defaultEncoding">
- <value>UTF-8</value>
- </property>
- </bean>
其中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();
- }
- }
在views文件夹中添加parambind.jsp和parambindresult.jsp两个视图,内容分别如下:
- <%@ 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>
- <form action="parambind?urlParam=AAA" method="post" enctype="multipart/form-data">
- <input type="text" name="formParam" /><br/>
- <input type="file" name="formFile" /><br/>
- <input type="submit" value="Submit" />
- </form>
- </body>
- </html>
- <%@ 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 ….