一、@RequestParam
GET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上
1. @RequestParam(org.springframework.web.bind.annotation.RequestParam)用于将指定的请求参数赋值给方法中的形参。
例:
(1) get请求:

url请求:http://localhost:8080/WxProgram/findAllBookByTag?tagId=1&pageIndex=3

userTest.jsp

<form action="/WxProgram/json/requestParamTest" method="get">
requestParam Test<br>
用户名:<input type="text" name="username"><br>
用户昵称:<input type="text" name="usernick"><br>
<input type="submit" value="提交">
</form>

UserController.java

    @RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick){
System.out.println("requestParam Test");
System.out.println("username: " + userName);
System.out.println("usernick: " + userNick);
return "hello";
}

上述代码会将请求中的username参数的值赋给username变量。

等价于:

    @RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(String username, HttpServletRequest request){
System.out.println("requestParam Test");
System.out.println("username: " + username);
String usernick = request.getParameter("usernick");
System.out.println("usernick: " + usernick);
return "hello";
}

也可以不使用@RequestParam,直接接收,此时要求controller方法中的参数名称要跟form中name名称一致

    @RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(String username, String usernick){
System.out.println("requestParam Test");
System.out.println("username: " + username);
System.out.println("usernick: " + usernick);
return "hello";
}

总结:

接收请求参数的方式:

@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick //value中的参数名称要跟name中参数名称一致
String username, String usernick// 此时要参数名称一致
HttpServletRequest request //request.getParameter("usernick")

(2) post请求:
跟get请求格式一样,只是把方法中的get换成post

@RequestParam
用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

RequestParam实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

get方式中query String的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到。

二. @RequestBody

@RequestBody注解可以接收json格式的数据,并将其转换成对应的数据类型。

1. @RequestBody接收一个对象
url请求:http://localhost:8080/WxProgram/findBookByName

@RequestMapping(value="/findBookByName", method = RequestMethod.POST)
@ResponseBody
public DbBook findBookByName(@RequestBody DbBook book){
System.out.println("book: " + book.toString());
System.out.println("book name: " + book.getTitle());
String bookName = book.getTitle();
DbBook book = wxService.findBookByName(bookName);
return book;
}

2. @RequestBody接收不同的字符串

(1)前台界面,这里以小程序为例

wx.request({
url: host.host + `/WxProgram/deleteBookById`,
method: 'POST',
data: {
nick: this.data.userInfo.nickName,
bookIds: bookIds
},
success: (res) => {
console.log(res);
this.getCollectionListFn();
},
fail: (err) => {
console.log(err);
}
})

(2)controller

@RequestMapping(value="/deleteBookById",method=RequestMethod.POST)
@ResponseBody
public void deleteBookById(@RequestBody Map<String, String> map){
String bookIds = map.get("bookIds");
String nick = map.get("nick");
String[] idArray = bookIds.split(",");
Integer userId = wxService.findIdByNick(nick);
for(String id : idArray){
Integer bookid = Integer.parseInt(id);
System.out.println("bookid: " + bookid);
wxService.removeBookById(bookid, userId);
}
}

@RequestBody
处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

@RequestBody用于post请求,不能用于get请求

这里涉及到使用@RequestBody接收不同的对象
1. 创建一个新的entity,将两个entity都进去。这是最简单的,但是不够“优雅”。
2. 用Map<String, Object>接受request body,自己反序列化到各个entity中。
3. 类似方法2,不过更为generic,实现自己的HandlerMethodArgumentResolver。参考这里

三、@ModelAttribute

@ModelAttribute注解类型将参数绑定到Model对象

1. userTest.jsp

<form action="/WxProgram/json/modelAttributeTest" method="post">
modelAttribute Test<br>
用户id:<input type="text" name="userId"><br>
用户名:<input type="text" name="userName"><br>
用户密码:<input type="password" name="userPwd"><br>
<input type="submit" value="提交"><br>
</form>

name的属性值要跟User的属性相对应。

2. UserController.java

@RequestMapping(value="/modelAttributeTest", method = RequestMethod.POST)
public String modelAttributeTest(@ModelAttribute User user){
System.out.println("modelAttribute Test");
System.out.println("userid: " + user.getUserId());
System.out.println("username: " + user.getUserName());
System.out.println("userpwd: " + user.getUserPwd());
return "hello";
}

3. User.java

public class User {
private Integer userId;
private String userName;
private String userPwd; public User(){
super();
}
//setter and getter
}

当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:
1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。

参考:

@RequestBody和@RequestParam区别

https://segmentfault.com/q/1010000009017635

@RequestParam、@RequestBody和@ModelAttribute区别的更多相关文章

  1. Spring @RequestParam、@RequestBody和@ModelAttribute区别

    一.@RequestParamGET和POST请求传的参数会自动转换赋值到@RequestParam 所注解的变量上1. @RequestParam(org.springframework.web.b ...

  2. SpringMVC传参注解@RequestParam,@RequestBody,@ResponseBody,@ModelAttribute

    参考文档:https://blog.csdn.net/walkerjong/article/details/7946109 https://www.cnblogs.com/daimajun/p/715 ...

  3. @PathVariable @RequestParam @RequestBody 的区别

    转载自:@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...

  4. Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

    (转自:http://blog.csdn.net/walkerjong/article/details/7946109#) 引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后, ...

  5. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    文章主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用. 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...

  6. 《转载》Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

    引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...

  7. 11.@RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: handler method ...

  8. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解(转)

    引言: 接上一篇文章,对@RequestMapping进行地址映射讲解之后,该篇主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: 简介: han ...

  9. SpringMVC之@RequestParam @RequestBody @RequestHeader 等详解

    转自:http://blog.csdn.net/kobejayandy/article/details/12690161?reload 简介: handler method 参数绑定常用的注解,我们根 ...

随机推荐

  1. jsp内置对象-out对象

    1.概念:隐含对象out是javax.servlet.jsp.JspWriter类的实例,是一个带缓冲的输出流,通过out对象实现服务器端向客户端输出字符串. 缓冲区的容量是可以设置的,甚至可以关闭, ...

  2. 【20190405】JavaScript-正则式匹配与替换结果解析

    在正则式的应用中有三个函数使用得最多:exec().test()与字符串的replace(reg, options).其中test()最简单,只要字符串与正则式可以匹配,就返回true,否则返回fal ...

  3. Dynamics 365支持的语言(中文语言名/英文语言名)列表

    本人微信和易信公众号:微软动态CRM专家罗勇 ,回复277或者20180803可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  4. 为什么AI的翻译水平还远不能和人类相比?

    为什么AI的翻译水平还远不能和人类相比? https://mp.weixin.qq.com/s/0koIt-qu9IOVxNhbFcZr1Q 作者 | SHARON ZHOU 译者 | 王天宇 编辑 ...

  5. Emmet 简介

    Emmet 简介 Intro 什么是 Emmet? Emmet is a plugin for many popular text editors which greatly improves HTM ...

  6. Django 数据流程图

    根据学习Django并且通过几个作业,发现Django制作网站的数据流程有些比较难懂,所以制作一个数据流程图,帮助自己理解,也希望对正学习的人有所帮助! 别的不多说,上美图:

  7. sql server 错误日志errorlog

    一 .概述 SQL Server 将某些系统事件和用户定义事件记录到 SQL Server 错误日志和 Microsoft Windows 应用程序日志中. 这两种日志都会自动给所有记录事件加上时间戳 ...

  8. Swift4.0 从相册中获取图片和拍照

    第一步 添加协议 UIImagePickerControllerDelegate,UINavigationControllerDelegate   第二步 添加选择方式 let sexActionSh ...

  9. 【Eclipse】springMVC介绍与配置

    SpringMCV介绍: Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动的,也就是使用 ...

  10. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...