目录
- @RequestPart
 - @RequestParam
 - 区别
 - 总结
 
@RequestPart
@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。- 支持的请求方法的方式
MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的 
@RequestParam
@RequestParam支持’application/json’,也同样支持multipart/form-data请求
@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)
@RequestParam可以接受简单类型的属性,也可以接受对象类型。(实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。)
知识点:在Content-Type: application/x-www-form-urlencoded的请求中,get 方式中queryString的值,和post方式中body data 的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。
区别
- 
当请求方法的请求参数类型不是String 或 MultipartFile / Part时,而是复杂的请求域时,@RequestParam 依赖Converter or PropertyEditor进行数据解析, RequestPart参考 ‘Content-Type’ header,依赖HttpMessageConverters 进行数据解析
 - 
当请求为
multipart/form-data时,@RequestParam只能接收String类型的name-value值,@RequestPart可以接收复杂的请求域(像json、xml);@RequestParam依赖Converter or PropertyEditor进行数据解析,@RequestPart参考'Content-Type' header,依赖HttpMessageConverters进行数据解析 
前台请求:jsonData为Person对象的json字符串uploadFile为上传的图片

后台接收:
@RequestPart可以将jsonData的json数据转换为Person对象
@RequestMapping("jsonDataAndUploadFile")
@ResponseBody
public String jsonDataAndUploadFile(@RequestPart("uploadFile") MultiPartFile uploadFile,
                                    @RequestPart("jsonData") Person person) {
    StringBuilder sb = new StringBuilder();
    sb.append(uploadFile.getOriginalFilename()).append(";;;"));
    return person.toString() + ":::" + sb.toString();
}
@RequestParam对于jsonData的json数据只能用String字符串来接收
@RequestMapping("jsonDataAndUploadFile")
@ResponseBody
public String jsonDataAndUploadFile(@RequestPart("uploadFile") MultiPartFile uploadFile,
                                    @RequestParam("josnData") String jsonData) {
    StringBuilder sb = new StringBuilder();
    sb.append(uploadFile.getOriginalFilename()).append(";;;"));
    return person.toString() + ":::" + sb.toString();
}
总结
当请求头中指定Content-Type:multipart/form-data时,传递的json参数,@RequestPart注解可以用对象来接收,@RequestParam只能用字符串接收

评论(0)