- 📌 博主簡介: 💻 努力學習的 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=Tom ) | URL參數或表單提交 | @RequestParam | 推薦? |
多個參數形成對象(如 ?name=Tom&age=20 ) | URL參數或表單提交 | @ModelAttribute | 推薦 ? |
JSON、XML數據 | 請求體(POST) | @RequestBody | 必須用 ? |
使用規范:
如果仍然覺得比較繞,最簡單粗暴的方式就是全部都用上參數綁定。
因為不論參數是否一致,始終明確標注注解,可以提高代碼可讀性和可維護性。