SpringMVC重要注解(三)@RequestParam

来源:互联网 发布:歼31是不是下马了知乎 编辑:程序博客网 时间:2024/06/02 05:05

为了验证文件绑定我们需要先做以下工作:


1.把commons-fileupload-1.3.1.jarcommons-io-2.2.jar两个jar包添加到我们项目。


2.配置我们项目中的spring-servlet.xml文件使之支持文件上传,内容如下:
  1. <!-- 支持上传文件 -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <!-- 设置上传文件的最大尺寸为1MB -->
  4. <property name="maxUploadSize">
  5. <value>1048576</value>
  6. </property>
  7. <property name="defaultEncoding">
  8. <value>UTF-8</value>
  9. </property>
  10. </bean>
其中maxUploadSize用于限制上传文件的最大大小,也可以不做设置,这样就代表上传文件的大小木有限制。defaultEncoding用于设置上传文件的编码格式,用于解决上传的文件中文名乱码问题。


下面就看具体如何使用:

添加一个DataBindController,里面有2个paramBind的action分别对应get和post请求:

  1. @Controller
  2. @RequestMapping(value = "databind")
  3. public class ParamBindController {
  4.  
  5. @GetMapping(value="test")
  6. @ResponseBody
  7. public String requestbodybind(String name,int age){
  8. return name + ">>>>" + age;
  9. }
  10.  
  11. @RequestMapping(value="parambind", method = {RequestMethod.GET})
  12. public ModelAndView paramBind(){
  13.  
  14. ModelAndView modelAndView = new ModelAndView();
  15. modelAndView.setViewName("parambind");
  16. return modelAndView;
  17. }
  18.  
  19. @RequestMapping(value="parambind", method = {RequestMethod.POST})
  20. public ModelAndView paramBind(HttpServletRequest request,
  21. @RequestParam("urlParam") String urlParam,
  22. @RequestParam("formParam") String formParam,
  23. @RequestParam("formFile") MultipartFile formFile){
  24.  
  25. //如果不用注解自动绑定,我们还可以像下面一样手动获取数据
  26. String urlParam1 = ServletRequestUtils.getStringParameter(request, "urlParam", null);
  27. String formParam1 = ServletRequestUtils.getStringParameter(request, "formParam", null);
  28. MultipartFile formFile1 = ((MultipartHttpServletRequest) request).getFile("formFile");
  29.  
  30. ModelAndView modelAndView = new ModelAndView();
  31. modelAndView.addObject("urlParam", urlParam);
  32. modelAndView.addObject("formParam", formParam);
  33. modelAndView.addObject("formFileName", formFile.getOriginalFilename());
  34.  
  35. modelAndView.addObject("urlParam1", urlParam1);
  36. modelAndView.addObject("formParam1", formParam1);
  37. modelAndView.addObject("formFileName1", formFile1.getOriginalFilename());
  38.  
  39. modelAndView.setViewName("parambindresult");
  40. return modelAndView;
  41. }
  42.  
  43. @RequestMapping(value="doUpload", method = {RequestMethod.POST})
  44. @ResponseBody
  45. public String doUpload(
  46. @RequestParam("file") MultipartFile formFile){
  47.  
  48. return formFile.getOriginalFilename();
  49. }
  50. }
在views文件夹中添加parambind.jspparambindresult.jsp两个视图,内容分别如下:
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. <form action="parambind?urlParam=AAA" method="post" enctype="multipart/form-data">
  11. <input type="text" name="formParam" /><br/>
  12. <input type="file" name="formFile" /><br/>
  13. <input type="submit" value="Submit" />
  14. </form>
  15. </body>
  16. </html>
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>Insert title here</title>
  8. </head>
  9. <body>
  10. 自动绑定数据:<br/><br/>
  11. ${urlParam}<br/>
  12. ${formParam}<br/>
  13. ${formFileName}<br/><br/><br/><br/>
  14. 手动获取数据:<br/><br/>
  15. ${urlParam1}<br/>
  16. ${formParam1}<br/>
  17. ${formFileName1}<br/>
  18. </body>
  19. </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模式会影响性能的,所以正式上线的时候,都会关掉的,如果我们没加的话就会报以下错误:


  1. Request processing failed;nested exception is java.lang.IllegalArgumentException:Name for argument type ….



原创粉丝点击