当前位置: 首页 > news >正文

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

@RequestBody 只能用一次,因为只有一个请求体

@RequestBody 流程
application/json
自动转换
Spring接收请求
前端发送JSON数据
Java对象
处理业务逻辑

示例代码:

// 1. @RequestBody示例 - 用于接收JSON数据
// 前端代码:
const user = {name: "张三",age: 25,phone: "13812345678"
};fetch('/api/user', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(user)
});// 后端代码:
@PostMapping("/api/user")
public R createUser(@RequestBody User user) {System.out.println(user.getName());    // 输出:张三return R.ok();
}

@RequestPart

@RequestPart 流程
multipart/form-data
JSON部分
文件部分
Spring接收复合请求
前端发送表单数据
Java对象
MultipartFile
处理业务逻辑

示例代码:
在这里插入图片描述

// 2. @RequestPart示例 - 用于文件上传+JSON
// 前端代码:
const formData = new FormData();
const userInfo = {name: "张三",age: 25
};
formData.append('userInfo', JSON.stringify(userInfo));
formData.append('avatar', fileInput.files[0]);  // 文件fetch('/api/user/profile', {method: 'POST',body: formData
});// 后端代码:
@PostMapping("/api/user/profile")
public R updateProfile(@RequestPart("userInfo") User user,@RequestPart("avatar") MultipartFile file
) {// 处理用户信息System.out.println(user.getName());    // 输出:张三// 处理文件String fileName = file.getOriginalFilename();return R.ok();
}

@ModelAttribute

@ModelAttribute 流程
form-data
自动映射字段
Spring接收表单
前端发送表单数据
Java对象
处理业务逻辑

示例代码:

// 3. @ModelAttribute示例 - 用于接收表单数据
// 前端代码:
const formData = new FormData();
formData.append('name', '张三');
formData.append('age', '25');
formData.append('phone', '13812345678');fetch('/api/user/create', {method: 'POST',body: formData
});// 后端代码:
@PostMapping("/api/user/create")
public R createUser(@ModelAttribute User user) {System.out.println(user.getName());    // 输出:张三return R.ok();
}

@RequestParam

@RequestParam 流程
URL参数或表单字段
自动类型转换
Spring接收单个参数
前端发送参数
Java基本类型
处理业务逻辑

示例代码:

// 4. @RequestParam示例 - 用于接收URL参数或单个表单字段
// 前端代码 - URL参数方式:
fetch('/api/user/search?name=张三&age=25');// 后端代码:
@GetMapping("/api/user/search")
public R searchUser(@RequestParam String name,                    // 必填参数@RequestParam(required = false) Integer age,  // 可选参数@RequestParam(defaultValue = "1") int page    // 带默认值的参数
) {System.out.println(name);     // 输出:张三System.out.println(age);      // 输出:25System.out.println(page);     // 如果未传,输出默认值:1return R.ok();
}

用户登录例子

// 实战示例:用户注册(包含基本信息和头像)
// 方式一:使用 @RequestPart(适合JSON)
@PostMapping("/register")
public R registerWithJson(@RequestPart("userInfo") UserRegisterDTO userInfo,  // JSON格式的用户信息@RequestPart("avatar") MultipartFile avatar         // 头像文件
) {String username = userInfo.getUsername();  // 从JSON中获取用户名String password = userInfo.getPassword();  // 从JSON中获取密码// 处理头像文件String avatarPath = saveAvatar(avatar);    // 保存头像// 处理注册逻辑return R.ok();
}// 方式二:使用 @ModelAttribute(适合普通表单)
@PostMapping("/register")
public R registerWithForm(@ModelAttribute UserRegisterDTO userInfo,    // 表单字段自动映射@RequestParam("avatar") MultipartFile avatar // 头像文件
) {String username = userInfo.getUsername();  // 从表单中获取用户名String password = userInfo.getPassword();  // 从表单中获取密码// 处理头像文件String avatarPath = saveAvatar(avatar);    // 保存头像// 处理注册逻辑return R.ok();
}

简单总结一下这四种注解的使用场景:

  1. @RequestBody

    • 特点:专门用于接收JSON数据
    • 使用场景:前端传递复杂JSON对象时
    • 常见用途:RESTful API的POST请求
  2. @RequestPart

    • 特点:可以同时处理文件和JSON数据
    • 使用场景:文件上传+复杂数据提交
    • 常见用途:带文件上传的表单提交
  3. @ModelAttribute

    • 特点:自动映射表单字段到对象
    • 使用场景:普通表单提交
    • 常见用途:简单的表单处理
  4. @RequestParam

    • 特点:接收单个参数
    • 使用场景:URL参数或简单表单字段
    • 常见用途:GET请求参数处理

实际应用建议:

  1. 如果是纯JSON数据传输,用@RequestBody
  2. 如果有文件上传,用@RequestPart
  3. 如果是普通表单提交,用@ModelAttribute
  4. 如果只是几个简单参数,用@RequestParam
    在这里插入图片描述

注意事项:

@RequestBody只能用一次,因为只有一个请求体
@RequestParam和@RequestPart的区别在于,RequestPart支持复杂对象的JSON数据
@ModelAttribute适合form表单,自动处理字段映射
文件上传一定要用multipart/form-data格式

相关文章:

流程图图解@RequestBody @RequestPart @RequestParam @ModelAttribute

RequestBody 只能用一次,因为只有一个请求体 #mermaid-svg-8WZfkzl0GPvOiNj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8WZfkzl0GPvOiNj3 .error-icon{fill:#552222;}#mermaid-svg-8WZfkzl0GPvOiNj…...

AutoUpdater.NET 实现 dotNET应用自动更新

AutoUpdater.NET 是一款用于WPF、Winform软件版本更新的框架,类似框架还有Squirrel、WinSparkle、NetSparkle、Google Omaha。 一、安装AutoUpdater.NET 首先,您需要在项目中安装AutoUpdater.NET库。您可以通过NuGet包管理器来安装它。在Visual Studio中…...

108. UE5 GAS RPG 实现地图名称更新和加载关卡

在这一篇里,我们将实现对存档的删除功能,在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置,我们可以通过存档进入游戏,玩家在游戏中可以在存档点存储存档。 实现删除存档 删除存档需要一个弹框确认&#xff0…...

对称加密与非对称加密:密码学的基石及 RSA 算法详解

对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…...

排列问题方法总结(递归+迭代)

递归 一、逐步生成结果法&#xff08;无序&#xff09; #include<iostream> #include<vector> #include<string> #include<algorithm>using namespace std;vector<string> GetChild(int n,int curIndex){vector<string> now;vector&…...

C#从入门到放弃

C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件&#xff0c;一个叫CLR(通用语言运行时)&#xff0c;另一个是用来构建程序的类库 CLR 用C写一个程序&#xff0c;在一台8688的机器…...

视频质量评价学习笔记

目录 MD VQA:大淘宝团队&#xff1a; ReIQA KVQ 视频质量评价学习笔记 MD VQA:大淘宝团队&#xff1a; https://github.com/kunyou99/MD-VQA_cvpr2023?tabreadme-ov-file ReIQA GitHub - avinabsaha/ReIQA: Official implementation for CVPR2023 Paper "Re-IQA : U…...

OpenCV、YOLO、VOC、COCO之间的关系和区别

OpenCV、YOLO、COCO 和 VOC 是计算机视觉和深度学习领域常见的几个名词&#xff0c;它们分别代表不同的工具、算法和数据集&#xff0c;之间有一些联系和区别。下面分别说明它们的定义、用途以及相互关系。 1. OpenCV&#xff08;Open Source Computer Vision Library&#xf…...

Pandas进行周期与时间戳转换

时间序列数据在数据分析和金融领域非常常见,处理这些数据时,通常会面临周期(Period)与时间戳(Timestamp)之间的转换需求。理解和掌握这种转换,对于时间序列数据的清洗、预处理以及进一步分析至关重要。Python 中的 pandas 库提供了一系列便捷的函数来帮助处理这些时间序…...

【GPTs】Get Simpsonized:一键变身趣味辛普森角色

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Get Simpsonized主要功能适用场景优点缺点使用方式 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 指令保护和安全规则&…...

概率论公式整理

1 概率 古典概型和几何概型 古典概型&#xff08;有限等可能&#xff09;几何概型&#xff08;无限等可能&#xff09; 条件概率 P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) \frac{P(AB)}{P(B)} P(A∣B)P(B)P(AB)​ 全概率公式 P ( B ) ∑ i 1 n P ( A i ) P ( B ∣ A i ) P…...

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单&#xff0c;现在来模拟实现一下&#xff0c;理解其底层的原理。 ​ 在实现之前&#xff0c;应该知道&#xff0c;stack 和 queue 都是容器适配器&#xff0c;通过看官网文件也可以看出来&#xff1b;其默认的容器都是deque&#xff…...

管家婆工贸ERP BR039.采购订单关联MRP明细表

最低适用版本&#xff1a; 工贸系列 23.8 插件简要功能说明&#xff1a; 采购订单明细表&#xff0c;支持显示采购订单明细上游请购单明细关联的MRP中对应销售订单明细产成品相关信息更多细节描述见下方详细文档 插件操作视频&#xff1a; 进销存类定制插件--采购订单关联M…...

SwanLab安装教程

SwanLab是一款开源、轻量级的AI实验跟踪工具&#xff0c;提供了一个跟踪、比较、和协作实验的平台&#xff0c;旨在加速AI研发团队100倍的研发效率。 其提供了友好的API和漂亮的界面&#xff0c;结合了超参数跟踪、指标记录、在线协作、实验链接分享、实时消息通知等功能&…...

MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具&#xff0c;它用于分析 SQL 查询的执行计划。通过 EXPLAIN&#xff0c;你可以获取 MySQL 是如何准备执行你的 SQL 语句的&#xff0c;包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。 使…...

利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能

某需求&#xff1a; 要求在任务截止日期的前3天时&#xff0c;系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单&#xff0c;没有使用消息列队&#xff0c;也不能使用延时队列来做。 用Timer的话开销还挺大的&a…...

如何基于Tesseract实现图片的文本识别

在前一篇文章基础上&#xff0c;如何将报告图片中的文本解析出来&#xff0c;最近研究了基于Tesseract的OCR方案&#xff0c;Tesseract OCR是一个开源的OCR引擎&#xff0c;主要结合开源的tesseract和pytesseract&#xff0c;实现了jpg/png等格式图片文本识别&#xff0c;供大家…...

JavaWeb之AJAX

前言 这一节讲JavaWeb之AJAX 1.概述 以前我们在servlet中得到数据&#xff0c;必须通过域给jsp&#xff0c;然后jsp在响应给浏览器 纯html不能获取servlet返回数据 所以我们用jsp 但是现在我们可以同AJAX给返回数据了 我们可以在sevlet中直接通过AJAX返回给浏览器 html中的J…...

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…...

1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)

文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...