`

(转)@RequestParam、@RequestBody和@ModelAttribute区别

阅读更多

转自:https://www.cnblogs.com/zeroingToOne/p/8992746.html

 

一、@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

分享到:
评论

相关推荐

    SpringMVC接收请求参数所有方式总结

    当前端发送JSON格式的数据时,可以使用`@RequestBody`注解,SpringMVC会根据Content-Type自动找到合适的`HttpMessageConverter`进行反序列化,如`MappingJackson2HttpMessageConverter`。 7. URL路径参数: `@...

    SpringBoot前后端传值.docx

    - `application/x-www-form-urlencoded`:此格式的数据可通过 `@RequestParam`、`@ModelAttribute` 或 `@RequestBody` 进行处理。 - `multipart/form-data`:当表单中包含文件上传时,必须指定 `enctype` 属性值为...

    springMVC接收参数的几种注解.pdf

    public void saveUser(@RequestBody User user) { // ... } ``` 这里,`User` 类会自动映射请求体中的 JSON 数据。 5. **@SessionAttributes 和 @ModelAttribute** `@SessionAttributes` 注解用于声明需要在 ...

    SpringMVC接收请求参数区别.docx

    在Spring MVC中,接收请求参数有多种方式,包括@RequestParam、@PathVariable、@RequestBody以及@ModelAttribute。这些注解各自适用于不同的场景,并且与HTTP请求的方法(GET、POST等)和Content-Type紧密相关。以下...

    Spring MVC实战系列教程(2)--常用请求参数接收方式

    3. **请求体(Request Body)** 对于POST、PUT或PATCH等请求,数据通常放在请求体中。若请求体是表单格式,我们可以使用`@ModelAttribute`注解来接收所有参数,这会将表单数据映射到一个Java对象上: ```java @...

    SpringMVC后台接收请求参数的几种方式Demo

    通过`@RequestBody`注解,Spring MVC会尝试将请求体转换为相应的Java对象: ```java @PostMapping("/create") public ResponseEntity createUser(@RequestBody User user) { // ... } ``` 6. **模型和视图...

    SpringMVC 常用注解类视频详解

    13. `@RequestBody`:用于读取HTTP请求体中的JSON或XML数据,将其转换为Java对象。 14. `@CookieValue`:用于从HTTP请求的Cookie中读取值。 15. `@ModelAttribute("attrName")`:配合`@SessionAttributes`使用,...

    alitytest:性格测试管理系统

    POST方法提时,根据请求标头Content-Type的值来判断:application / x-www-form-urlencoded,可选(即非必须,因为这种情况的数据@RequestParam,@ ModelAttribute也可以处理,当然@RequestBody也能处理);...

    springmvc 参数绑定例子1

    在Spring MVC中,可以创建一个接受`@RequestBody`注解的控制器方法,该注解表示请求体应被解析为一个对象。 - **Jackson 库**:Spring MVC默认使用Jackson库来反序列化JSON数据,将JSON字符串转换为Java对象。 ```...

    基于注解的springMVC简单的例子

    `@RequestBody`和`@ResponseBody`用于将HTTP请求体或响应体直接映射为Java对象。`@ModelAttribute`还可以配合`@InitBinder`进行数据绑定的自定义。 **总结** 基于注解的SpringMVC大大简化了Web应用的开发,通过...

    springmvc各种参数绑定

    Spring MVC还支持直接使用HTTP方法(GET, POST等)作为参数,如`public ResponseEntity&lt;?&gt; handlePost(@RequestBody User user)`,其中`@RequestBody`用于将请求体转换为Java对象。 7. **多部分文件上传**: 在...

    springMVC接收参数的几种注解.docx

    - `@RequestBody` 注解用于从请求体中获取内容,通常用于处理`Content-Type: application/json`或`Content-Type: application/xml`的数据。Spring MVC会尝试使用配置的`HttpMessageConverter`来将请求体解析为Java...

    注解配置SpringMVC

    @RequestBody 和 @ResponseBody `@RequestBody` 注解用于将请求体中的JSON或XML数据转换为Java对象,而`@ResponseBody`则将方法的返回值转换为HTTP响应体的输出内容。 ```java @PostMapping("/save") public @...

    springMVC配置、注解、列子

    6. `@RequestBody` 和 `@ResponseBody`:将请求体转换为对象,或者将响应对象直接写入响应体。 7. `@ModelAttribute`:用于绑定请求参数到模型对象,常与表单提交一起使用。 现在,让我们通过一个例子来理解这些...

    Spring 注解学习手札(二) 控制层梳理

    六、@RequestBody和@ResponseBody注解 这两个注解配合使用,可以将HTTP请求体中的数据自动转换为Java对象,或者将方法返回的对象转换为HTTP响应体。@RequestBody用于接收POST请求中的JSON或XML数据,而@ResponseBody...

    Springmvc请求处理方法参数

    通过`@RequestBody`注解,我们可以将JSON数据自动绑定到Java对象上。 ```java @RequestMapping(method = RequestMethod.POST) public ResponseEntity createUser(@RequestBody User user) { // ... } ``` ### 8. ...

    springmvc注解详解

    `@RequestBody` 注解用于将请求体的内容映射到方法参数上,通常用于接收 JSON 或 XML 数据。Spring MVC 自动将请求体的内容转换为指定的对象类型。 ### 7. `@ResponseBody` `@ResponseBody` 注解用于将方法返回的...

    spring3.0MVC注解(附实例).docx

    6. **@RequestBody** 和 **@ResponseBody** - `@RequestBody` 用于将请求体转换为方法参数,常用于处理JSON或XML格式的数据。 - `@ResponseBody` 用于将方法的返回值直接写入HTTP响应体,而非通过视图解析器进行...

    注解式springMVC的demo

    7. **@RequestBody 和 @ResponseBody** `@RequestBody`用于将HTTP请求体中的数据转换为方法参数,而`@ResponseBody`将方法返回值直接写入HTTP响应体,通常用于返回JSON或XML格式的数据。 8. **@ModelAttribute** ...

    SpringMVC框架实例

    在SpringMVC中,请求参数可以通过注解如@RequestParam、@PathVariable和@RequestBody进行获取。例如,使用@RequestParam可以将请求参数绑定到方法参数上。对于复杂的表单数据,可以使用@ModelAttribute注解结合...

Global site tag (gtag.js) - Google Analytics