關(guān)于@RequestParam和@RequestBody的用法及說明
碎碎念
作為一名學(xué)習(xí)spring框架的小白來說,項(xiàng)目實(shí)戰(zhàn)無疑是學(xué)習(xí)成長速度最快的階段之一。但這也不免會(huì)遇到很多折磨人的知識(shí)點(diǎn)讓人防不勝防。比如參數(shù)綁定相關(guān)注解的使用:
- @Param
- @RequestParam
- @RequestBody
用哪個(gè)?啥時(shí)候必須用?啥時(shí)候可以不用?把俺整的的一愣一愣的。
于是特意整理了這篇博客,目的是幫助大家快速理清這些注解的使用場景和區(qū)別,避開常見的坑點(diǎn)。
前言
本博客將會(huì)詳細(xì)講解以下參數(shù)綁定相關(guān)注解的使用場景,說明它們之間的關(guān)系和區(qū)別,以及在項(xiàng)目開發(fā)中使用的規(guī)范:
- @RequestParam
- @RequestBody
- @@ModelAttribute
一、@RequestParam
@RequestParam專門用于獲取請(qǐng)求URL中的參數(shù),也就是問號(hào)?后面的參數(shù)。(HTML的form表單也適用)
例如下面的請(qǐng)求:
GET /search?name=Tom&age=25
對(duì)應(yīng)的Controller方法:
@GetMapping("/search")
public String search(@RequestParam String name, @RequestParam Integer age) {
return "搜索名字:" + name + ",年齡:" + age;
}
什么時(shí)候必須用@RequestParam?
當(dāng)方法參數(shù)名和請(qǐng)求參數(shù)名不一致時(shí)必須用:
@GetMapping("/search")
public String search(@RequestParam("user_name") String name) {
return name;
}
參數(shù)非必傳時(shí)(可選)必須明確標(biāo)注:
@GetMapping("/search")
public String search(@RequestParam(required = false) String name) {
return name;
}
RequestParam(required = false)的意思是如果前端沒有傳遞參數(shù)name,不會(huì)直接報(bào)錯(cuò),而是賦值null。
什么時(shí)候可以不用@RequestParam?
當(dāng)方法參數(shù)名和請(qǐng)求URL參數(shù)名完全一致并且參數(shù)是必傳時(shí),可以省略:
// URL: /search?name=Tom
@GetMapping("/search")
public String search(String name) {
return name;
}
二、@ModelAttribute
作用
@ModelAttribute`注解專門用于將請(qǐng)求參數(shù)(URL參數(shù)或表單數(shù)據(jù))綁定到一個(gè)Java對(duì)象中,尤其適合表單提交的場景或有多個(gè)參數(shù)需要綁定的情況。
例如請(qǐng)求:
GET /user?name=Tom&age=20
對(duì)應(yīng)的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時(shí)的注意點(diǎn):
- 對(duì)象的屬性名稱必須與請(qǐng)求中的參數(shù)名稱保持一致,這樣才能正確綁定。
- 如果有多個(gè)參數(shù),并且這些參數(shù)是Java對(duì)象的,那么推薦使用這個(gè)注解(前端發(fā)送請(qǐng)求非JSON等格式的情況下)
三、@RequestBody
@RequestBody用于接收HTTP請(qǐng)求體(Request Body)中的數(shù)據(jù),常用于POST請(qǐng)求,通常是JSON格式的數(shù)據(jù)。
例如POST請(qǐng)求:
POST /user
Content-Type: application/json
{
"name": "Alice",
"age": 30
}
對(duì)應(yīng)的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方法
}
什么時(shí)候必須用@RequestBody?
- 前端發(fā)送JSON數(shù)據(jù)或XML數(shù)據(jù)等格式到后端時(shí)必須用。
- 當(dāng)你需要整個(gè)請(qǐng)求體的數(shù)據(jù)綁定到一個(gè)Java對(duì)象時(shí)。
什么時(shí)候可以不用@RequestBody?
- 當(dāng)數(shù)據(jù)從URL參數(shù)(如GET請(qǐng)求)或表單數(shù)據(jù)中獲取時(shí),不需要也不能使用@RequestBody。
- 對(duì)于表單提交,可以使用
@ModelAttribute來代替:
@PostMapping("/submit")
public String submitForm(@ModelAttribute User user) {
return user.getName();
}
四、表格整理
| 場景 | 傳參方式 | 適用注解 | 是否必須 |
|---|---|---|---|
| 單個(gè)或少量簡單參數(shù)(如 ?name=Tom) | URL參數(shù)或表單提交 | @RequestParam | 否 |
| 多個(gè)參數(shù)形成對(duì)象(如 ?name=Tom&age=20) | URL參數(shù)或表單提交 | @ModelAttribute | 否 |
| JSON、XML數(shù)據(jù) | 請(qǐng)求體(POST) | @RequestBody | 是 |
使用規(guī)范:
如果仍然覺得比較繞,最簡單粗暴的方式就是全部都用上參數(shù)綁定。
因?yàn)椴徽搮?shù)是否一致,始終明確標(biāo)注注解,可以提高代碼可讀性和可維護(hù)性。
五、總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- @RequestBody和@RequestParam接受參數(shù)的情況分析
- SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解
- Spring中@RequestParam、@RequestBody和@PathVariable的用法詳解
- Spring中@RequestParam與@RequestBody的使用場景詳解
- SpringBoot傳遞單一參數(shù)時(shí)@RequestParam和@RequestBody的區(qū)別小結(jié)
- @RequestParam?和@RequestBody注解的區(qū)別解析
相關(guān)文章
Shell重啟SpringBoot項(xiàng)目腳本的示例代碼(含服務(wù)守護(hù))
本文介紹了如何使用?Bash?腳本來管理和守護(hù)運(yùn)行服務(wù),將展示一個(gè)示例腳本,該腳本可以停止、啟動(dòng)和守護(hù)運(yùn)行一個(gè)服務(wù),并提供了相應(yīng)的解釋和用法說明,文章通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
圖解二叉樹的三種遍歷方式及java實(shí)現(xiàn)代碼
本篇文章主要介紹了圖解二叉樹的三種遍歷方式及java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07
Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)解析dcm醫(yī)學(xué)影像文件并提取文件信息的方法,結(jié)合實(shí)例形式分析了java基于第三方庫文件針對(duì)dcm醫(yī)學(xué)影像文件的解析操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04
Java中連接數(shù)據(jù)庫方式詳細(xì)步驟記錄
這篇文章主要介紹了Java中連接數(shù)據(jù)庫方式的詳細(xì)步驟,包括添加依賴、建立連接、執(zhí)行SQL語句、處理結(jié)果集和關(guān)閉連接,還討論了數(shù)據(jù)庫連接池的使用,需要的朋友可以參考下2025-01-01
Netty分布式flush方法刷新buffer隊(duì)列源碼剖析
這篇文章主要為大家介紹了Netty分布式flush方法刷新buffer隊(duì)列源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
java 使用線程監(jiān)控文件目錄變化的實(shí)現(xiàn)方法
這篇文章主要介紹了java 使用線程監(jiān)控文件目錄變化的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10
bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索的實(shí)例
下面小編就為大家?guī)硪黄猙ootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案
這篇文章主要介紹了springboot基于Redis發(fā)布訂閱集群下WebSocket的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解
這篇文章主要介紹了JAVA加密算法數(shù)字簽名實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10

