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

