通俗易懂搞懂@RequestParam 和 @RequestBody

  • 📌 博主簡介: 💻 努力學習的 23 級科班生一枚 🚀
  • 🏠 博主主頁 : 📎 @灰陽陽
  • 📚 往期回顧 :Session和Cookie我不允許你不懂
  • 💬 每日一言: 「流水不爭先,爭的是滔滔不絕」 🌊

碎碎念
作為一名學習spring框架的小白來說,項目實戰無疑是學習成長速度最快的階段之一。但這也不免會遇到很多折磨人的知識點讓人防不勝防。比如參數綁定相關注解的使用:

  • @Param
  • @RequestParam
  • @RequestBody

用哪個?啥時候必須用?啥時候可以不用?把俺整的的一愣一愣的。
在這里插入圖片描述
于是特意整理了這篇博客,目的是幫助大家快速理清這些注解的使用場景和區別,避開常見的坑點。


目錄

  • 前言
  • 一、@RequestParam
    • 什么時候必須用@RequestParam?
    • 什么時候可以不用@RequestParam?
  • 二、@ModelAttribute
    • 作用
    • 使用@ModelAttribute時的注意點:
  • 三、@RequestBody
    • 什么時候必須用@RequestBody?
    • 什么時候可以不用@RequestBody?
  • 四、表格整理


前言

本博客將會詳細講解以下參數綁定相關注解的使用場景,說明它們之間的關系和區別,以及在項目開發中使用的規范

  • @RequestParam
  • @RequestBody
  • @@ModelAttribute

一、@RequestParam

@RequestParam專門用于獲取請求URL中的參數,也就是問號?后面的參數。(HTML的form表單也適用)

例如下面的請求:

GET /search?name=Tom&age=25

對應的Controller方法:

@GetMapping("/search")
public String search(@RequestParam String name, @RequestParam Integer age) {return "搜索名字:" + name + ",年齡:" + age;
}

什么時候必須用@RequestParam?

  • 當方法參數名和請求參數名不一致時必須用

    @GetMapping("/search")
    public String search(@RequestParam("user_name") String name) {return name;
    }
    
  • 參數非必傳時(可選)必須明確標注

    @GetMapping("/search")
    public String search(@RequestParam(required = false) String name) {return name;
    }
    

RequestParam(required = false)的意思是如果前端沒有傳遞參數name,不會直接報錯,而是賦值null。

什么時候可以不用@RequestParam?

  • 當方法參數名和請求URL參數名完全一致并且參數是必傳時,可以省略:

    // URL: /search?name=Tom
    @GetMapping("/search")
    public String search(String name) {return name;
    }
    

二、@ModelAttribute

作用

@ModelAttribute`注解專門用于將請求參數(URL參數表單數據)綁定到一個Java對象中,尤其適合表單提交的場景或有多個參數需要綁定的情況。

例如請求:

GET /user?name=Tom&age=20

對應的Controller方法:

@GetMapping("/user")
public String getUser(@ModelAttribute User user) {return "姓名:" + user.getName() + ",年齡:" + user.getAge();
}

User類定義:

public class User {private String name;private Integer age;// getter和setter方法必須提供
}

使用@ModelAttribute時的注意點:

  • 對象的屬性名稱必須與請求中的參數名稱保持一致,這樣才能正確綁定。
  • 如果有多個參數,并且這些參數是Java對象的,那么推薦使用這個注解(前端發送請求非JSON等格式的情況下)

三、@RequestBody

@RequestBody用于接收HTTP請求體(Request Body)中的數據,常用于POST請求,通常是JSON格式的數據。

例如POST請求:

POST /user
Content-Type: application/json{"name": "Alice","age": 30
}

對應的Controller方法:

@PostMapping("/user")
public String createUser(@RequestBody User user) {return "用戶姓名:" + user.getName() + ",年齡:" + user.getAge();
}

User類定義:

public class User {private String name;private Integer age;// getter和setter方法
}

什么時候必須用@RequestBody?

  • 前端發送JSON數據或XML數據等格式到后端時必須用
  • 當你需要整個請求體的數據綁定到一個Java對象時。

什么時候可以不用@RequestBody?

  • 當數據從URL參數(如GET請求)或表單數據中獲取時,不需要也不能使用@RequestBody。
  • 對于表單提交,可以使用@ModelAttribute來代替:
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {return user.getName();
}

四、表格整理

場景傳參方式適用注解是否必須
單個或少量簡單參數(如 ?name=TomURL參數或表單提交@RequestParam推薦?
多個參數形成對象(如 ?name=Tom&age=20URL參數或表單提交@ModelAttribute推薦 ?
JSON、XML數據請求體(POST)@RequestBody必須用 ?

使用規范:
如果仍然覺得比較繞,最簡單粗暴的方式就是全部都用上參數綁定。
因為不論參數是否一致,始終明確標注注解,可以提高代碼可讀性和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74187.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74187.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74187.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dubbo版本與分組

Dubbo服務中,接口并不能唯一確定一個服務,只有 接口分組版本號 的三元組才能唯一確定一個服務。 當同一個接口針對不同的業務場景、不同的使用需求或者不同的功能模塊等場景,可使用服務分組來區分不同的實現方式。同時,這些不同實…

RAG現有技術方案

RAG現有技術方案 一、現有技術方案的核心問題 檢索質量不足 挑戰:傳統RAG系統依賴單輪檢索,難以應對智能電網的海量異構數據(如傳感器讀數、控制參數),導致檢索結果相關性低、覆蓋不全。案例:BM25稀疏檢索在處理長文本或專業術語時,易遺漏語義關聯;BGE等稠密檢索模型對…

redis MISCONF Redis is configured to save RDB snapshots報錯解決

直接上解決方案 修改redis配置文件 stop-writes-on-bgsave-error no 重啟redis

個人學習編程(3-22) leetcode刷題

連續子數組:(難) 示例 1: 輸入: nums [0,1] 輸出: 2 說明: [0, 1] 是具有相同數量 0 和 1 的最長連續子數組。 示例 2: 輸入: nums [0,1,0] 輸出: 2 說明: [0, 1] (或 [1, 0]) 是具有相同數量0和1的最長連續子數組。 需要理解的知識&a…

希爾排序

希爾排序是一種改進的插入排序算法,它通過將原始數據分成多個子序列來改善插入排序的性能,每個子序列的元素間隔為 d(增量)。隨著算法的進行,d 逐漸減小,最終減為 1,此時整個序列就被排序好了。…

JavaScript基礎-DOM事件流

在Web開發過程中,理解和掌握DOM事件流是實現高效交互的關鍵。DOM事件流描述了當一個事件發生時,它在文檔樹中的傳播路徑。了解事件流的概念有助于我們更精確地控制事件處理邏輯,避免不必要的行為,并提升用戶體驗。本文將深入探討D…

C語言基礎知識07---預編譯模塊化

目錄 預編譯指令 1.1 編譯流程 1.2 文件包含 1.3 條件編譯 1.4 宏定義 1.5 無參宏 1.6 typedef和無參宏的區別 1.7 有參宏 1.8 函數與有參宏的區別 1.9 取消宏定義 #undef 1.10 符合使用 模塊化操作 1.1 H文件:固定模版 1.2 C文件:源文件-…

自由學習記錄(46)

CG語法的數據類型 // uint : 無符號整數(32位) // int : 有符號整數(32位) // float : 單精度浮點數(32位),通常帶后綴 f(如 1.0f) // half : 半精度浮…

Agent:大模型中的智能“函數”

在傳統的編程范式中,函數是執行特定任務的基本單元。它們接收輸入參數,執行預定義的操作,并返回結果。這種模式在確定性和結構化任務中非常有效,但在處理復雜、開放性和非結構化的任務時,函數的局限性就顯現出來了。隨…

【數據結構】kmp算法介紹+模板代碼

目錄 1.kmp算法介紹 2.應用場景 3.KMP與暴力算法比較 4.模板代碼 KMP算法是一種高效的字符串匹配算法,用于在文本串中快速查找模式串的所有出現位置。其核心思想是通過預處理模式串,避免在匹配失敗時進行不必要的回溯,從而將時間復雜度優…

(自用)yolo算法學習

1.難受中,看了教程過后無從下手啊 2.pycharm專業版成功就好 3.安裝包時出先問題 (base) PS G:\pycharm\projects\yolo\yolov5> pip install opencv-python>4.1.1 Requirement already satisfied: opencv-python>4.1.1 in g:\anaconda\app\lib\site-packa…

實用工具-Another Redis Desktop Manager介紹

GitHub:https://github.com/qishibo/AnotherRedisDesktopManager/releases Gitee:AnotherRedisDesktopManager 發行版 - Gitee.com Another Redis Desktop Manager 是一款免費的 Redis 可視化管理工具,具有以下特點和功能: 特…

【Azure 架構師學習筆記】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Networking】系列。 前言 最近公司的安全部門在審計云環境安全性時經常提到service endpoint(SE)和priavate endpoint(PE)的術語,為此做了一些研究儲備。 云…

【汽車開發工具選型指南】Jama Connect? for Automotive解決方案解析

本文來源jamasoftware.com,由Jama Software授權合作伙伴-龍智翻譯整理。 Jama Connect for Automotive是什么? Jama Connect for Automotive 旨在為開發團隊提供一個統一平臺,用于構建安全關鍵型和網絡安全關鍵型產品。提供滿足行業標準和法…

同旺科技USB to SPI 適配器 ---- 指令循環發送功能

所需設備: 內附鏈接 1、同旺科技USB to SPI 適配器 1、周期性的指令一次輸入,即可以使用 “單次發送” 功能,也可以使用 “循環發送” 功能,大大減輕發送指令的編輯效率; 2、 “單次發送” 功能,“發送數據…

分布式中間件:基于 Redis 實現分布式鎖

分布式中間件:基于 Redis 實現分布式鎖 一、背景引入 在當今的互聯網應用中,分布式系統變得越來越常見。在分布式環境下,多個服務實例可能會同時對共享資源進行讀寫操作,這就很容易引發數據不一致等問題。比如電商系統中的庫存扣…

嘗試使用Tauri2+Django+React項目(2)

前言 嘗試使用tauri2DjangoReact的項目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面筆者不知道怎么做,搞了半天 筆者看到官網,原來可以使用二進制文件,好好好 嵌入外部二進制文件 | Taurihttps://v2.taur…

【006安卓開發方案調研】之大廠APP混合開發方案

基于國內大廠在安卓混合開發領域的實踐,以下是主流解決方案及其核心技術實現路徑的深度解析: 一、主流混合開發解決方案分類 1. Flutter混合開發體系 架構設計 采用組件化分層架構,原生工程作為宿主,通過MethodChannel與Flutter…

Mysql配套測試之查詢篇

&#x1f3dd;?專欄&#xff1a;Mysql_貓咪-9527的博客-CSDN博客 &#x1f305;主頁&#xff1a;貓咪-9527-CSDN博客 “欲窮千里目&#xff0c;更上一層樓。會當凌絕頂&#xff0c;一覽眾山小。” 目錄 條件查詢簡單測試&#xff1a; 1.查詢英語成績不及格的同學(<60) 2…

設計和布局硬件電路是嵌入式系統開發的重要環節

設計和布局硬件電路是嵌入式系統開發的重要環節&#xff0c;涉及從需求分析到原理圖設計、PCB&#xff08;印刷電路板&#xff09;布局以及最終的硬件調試。以下是完整的流程和技術要點&#xff1a; 1. 硬件電路設計的基本流程 1.1 需求分析 明確功能需求&#xff1a;確定系統…