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

@RequestBody 只能用一次,因为只有一个请求体
@RequestBody 流程 application/json 自动转换 Spring接收请求 前端发送JSON数据 Java对象 处理业务逻辑

示例代码:

javascript 复制代码
// 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 处理业务逻辑

示例代码:

javascript 复制代码
// 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对象 处理业务逻辑

示例代码:

javascript 复制代码
// 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基本类型 处理业务逻辑

示例代码:

javascript 复制代码
// 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);      // 输出:25
    System.out.println(page);     // 如果未传,输出默认值:1
    return R.ok();
}

用户登录例子

javascript 复制代码
// 实战示例:用户注册(包含基本信息和头像)
// 方式一:使用 @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格式

相关推荐
檐下翻书1731 天前
流程图配色与美化:让你的图表会“说话”
论文阅读·人工智能·信息可视化·流程图·论文笔记
一水鉴天1 天前
整体设计 全面梳理复盘 之40 M3 统摄三层 AI 的动态运营社区(Homepage)设计
架构·transformer·状态模式·公共逻辑
不爱学习的YY酱2 天前
告别局域网束缚!Excalidraw结合cpolar随时随地画流程图
安全·流程图·cpolar
secondyoung2 天前
Mermaid流程图高效转换为图片方案
c语言·人工智能·windows·vscode·python·docker·流程图
wfsm2 天前
flowable05外置表单和绘制流程图
流程图
TomCode先生2 天前
MES 学习方法深度落地指南:流程图绘制、系统支撑分析、角色场景模拟
流程图·学习方法·mes
前端玖耀里4 天前
Vue + Axios + Node.js(Express)如何实现无感刷新Token?
状态模式
将编程培养成爱好5 天前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式
AscendKing5 天前
开源白板工具(SaaS),一体化白板,包含思维导图、流程图、自由画等
开源·流程图·好好学电脑·hhxdn.com
向葭奔赴♡5 天前
Spring Boot参数校验全流程解析
状态模式