SpringMVC中@ModelAttribute与@RequestBody的区别及说明
作者:弱水提沧 发布时间:2023-11-24 12:09:51
@ModelAttribute与@RequestBody的区别
最近在写代码的过程中,发现之前项目都是使用的@ModelAttribute注解,而自己的一贯使用都是@RequestBody,在网上找资料也没有发现写的十分具体的博客,因此自己写了个SpringBoot的样例进行了测试验证。
@ModelAttribute与@RequestBody都是用来注解解析前端发来数据,并自动对应到所定义的字段名称。
这里先放结论
使用@ModelAttribute注解的实体类接收前端发来的数据格式需要为"x-www-form-urlencoded",@RequestBody注解的实体类接收前端的数据格式为JSON(application/json)格式。
(若是使用@ModelAttribute接收application/json格式,虽然不会报错,但是值并不会自动填入)
测试
首先新建一个SpringBoot项目,这个不需要像SpringMVC项目那么配置麻烦,因为十分推荐这个。
导入需要的spring-boot-starter-web包。由于测试的前端发送的为json数据,因此还需要导入json依赖。
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
根据前端发送的数据,定义自己的接收实体类RuleModify,其字段名与前端发送的key值一致,若是需要改变,可以使用@SerializerName("")进行对应相应的key值。这里就不贴出代码。
在Controller层对于要测试的方法使用@RequestBody接收前端数据,可以看到数据都一一对应到实体类中了(测试工具为postman)。
@RestController
@RequestMapping("/")
public class TestController {
@RequestMapping(value = "/test" ,method = RequestMethod.POST)
public String testJson(@RequestBody RuleModify rule){
System.out.println("执行");
JSONObject jsonObject = JSONObject.fromObject(rule);
System.out.println(jsonObject);
return "hello";
}
}
postman模拟前端发送请求。
可以看到成功打印出实体类,数据已经对应到字段中了。
接下来使用@ModelAttribute注解RuleModify类,可以看到JSON(application/json) 格式下,数据为空,字段没有进行注入。
使用postman的x-www-form-urlencoded方式进行模拟
可以看到后端成功的注入了数据。
至于这两个注解的选择,还是看前端会发送什么格式的数据之后来进行自由的选择吧。
来源:https://blog.csdn.net/qq_42684642/article/details/83058211
猜你喜欢
- 前言在一些项目中,经常会遇到需要把当前线程中的上下文传递到其他线程中的情况,比如某项目包含国际化操作,在业务请求进来时需要把对应的国家代码存
- Jackson解析嵌套类(MismatchedInputException)具体报错如下问题描述:Jackson解析嵌套类问题 调
- 一、问题背景在Intellij idea中,新建Maven项目,在魔项目中新建多个模块,发现模块间相互调用失败二、问题原因模块间无法相互引用
- 这篇文章主要介绍了JAVA实现账户取款和存款操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
- 一、定义登录控制器目录结构代码:1、创建TUser类package com.demo.pojo;import lombok.AllArgsC
- 一、什么是iText?在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Js
- 在分支较多的时候,switch的效率比if高,在反汇编中我们即可看到效率高的原因一、switch语句1、在正向编码时,switch语句可以看
- 项目需要去调用.NET的WebSrevice,本身是Java,研究了半天,终于有些头绪,记下来。1,新建.NET WebService。只在
- 概念尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的
- 一、介绍在实际的软件项目开发过程中,我可以很负责任的跟大家说,如果你真的实际写代码的时间超过5年,你对增删改查这类简单的功能需求开发,可以说
- 本文实例为大家分享了iOS新浪微博分享功能的具体代码,供大家参考,具体内容如下做新浪分享 需先去http://open.weibo.com/
- 前言最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大
- 在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较
- 一、文件存储特点:openFileInput()和openFileOutput()读取设备上的文件。优点:适用于存储大量的数据,可以存储图片
- java 读取本地文件实例详解用javax.xml、w3c解析实例代码:package cn.com.xinli.monitor.utils
- Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。Memento模式相
- 1. pom.xml文件配置<?xml version="1.0" encoding="UTF-8&qu
- FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化
- 一、流程和任务的关系以下是一个简单的请假流程图,其中有一个开始事件,两个用户任务,一个结束事件。启动流程后,activiti会自动创建第一个
- 配置操作第一步操作如图:选择右侧的database页签,一般在idea的右边会有Database界面,点击它即可。有时候我们会发现这个Dat