栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Spring MVC:@RequestBody VS @ModelAttribute

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC:@RequestBody VS @ModelAttribute

Why is it necessary for Spring to have those two differentannotations?

为不同的应用程序类型创建了两个注释。
-用于Restfull应用程序的@RequestBody-
用于Web MVC应用程序的@ModelAttribute

他们有什么区别?

假设您有一个Java类UserData:

public class UserData {    private String firstName;    private String lastName;    //...getters and setters}

您想使用此用户数据使用请求并映射到您的对象字段。

@RequestBody 用于使用请求正文,并通过HttpMessageConverter反序列化为Object。您可以通过在此批注中指定“
consums”来提供@PostMapping可以接受的数据类型。

参考:https :
//docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-
ann-requestbody

带有用户数据json主体的POST请求示例:

POST /api/v1/auth HTTP/1.1Host: localhost:8080Connection: keep-aliveContent-Length: 40Accept: application/json, text/plain, */*Content-Type: application/json{"firstName":"Tyrion","lastName":"Lannister"}

您可以简单地用注解@RequestBody注释方法参数,所有数据都将在模型中转换

@PostMapping("/user")public void getUserData( @RequestBody UserData userData) {     // ...   }

否则,您必须将请求作为字符串使用,然后自己手动进行反序列化:

ObjectMapper objectMapper = new ObjectMapper();UserData userData = objectMapper.readValue(postBody, UserData.class)

@ModelAttribute
是ServletRequest的增强功能,使您不必处理解析和转换单个查询参数和表单字段的麻烦。您只需使用此注释来注释您的请求正文,而无需执行任何其他操作:

String firstName= req.getParameter("firstName"); // req is HttpServletRequestString lastName= req.getParameter("lastName"); // req is HttpServletRequest

弹簧将自动转换所有数据。

参考:https :
//docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-
ann-modelattrib-method-
args

此请求的表单示例如下:

<form action="yourEndpoint" method="POST">    <input name="firstName" id="firstName" value="Tyrion">    <input name="lastName" id="lastName" value="Lannister">    <button>Submit</button></form>

该表单将通过Web浏览器转换为以下请求,该请求将在spring之前完成:

POST / HTTP/2.0Host: foo.comContent-Type: application/x-www-form-urlenpredContent-Length: 13firstName=Tyrion&lastName=Lannister

Spring MVC控制器的示例:

@PostMapping("/user")public void getUserData( @ModelAttribute UserData userData ) {     // ...   }


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635773.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号