SpringMVC重要注解(三)@RequestParam

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

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


  1. 配置我们项目中的spring-servlet.xml文件使之支持文件上传,内容如下:
  2. <!-- 支持上传文件 -->    
    <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 ….



            </div>

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

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


  1. 配置我们项目中的spring-servlet.xml文件使之支持文件上传,内容如下:
  2. <!-- 支持上传文件 -->    
    <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 ….



            </div>

猜你喜欢

转载自blog.csdn.net/zjttlance/article/details/81703639
今日推荐