一、@RequestParam
@PostMapping("/getUserLogin")
public String getUserLogin(@RequestParam("username") String username,
@RequestParam("password") String password) {
selectByCond(username,password);
}
注:如果引數前寫了@RequestParam(xxx),那么前端必須有對應的xxx名字才行(不管其是否有值,當然可以通過設定該注解的required屬性來調節是否必須傳),如果沒有xxx名的話,那么請求會出錯,報400,
注:如果引數前不寫@RequestParam(xxx)的話,那么就前端可以有可以沒有對應的xxx名字才行,如果有xxx名的話,那么就會自動匹配;沒有的話,請求也能正確發送,
追注:這里與feign消費服務時不同;feign消費服務時,如果引數前什么也不寫,那么會被默認是@RequestBody的,
當同時使用@RequestParam()和@RequestBody時,@RequestParam()指定的引數可以是普通元素、陣列、集合、物件等等
二、@ModelAttribute
@PostMapping("/getUserLogin")
public String getUserLogin(@ModelAttribute UserLogin userLogin) {
String username = userLogin.getUsername;
String password = userLogin.getPassword;
selectByCond(username,password);
}
1、@ModelAttribute可以注釋在方法上,在用@RequestMapping注解的控制器方法被呼叫之前呼叫@ModelAttribute方法,
2、當作為方法的引數使用,指示的引數應該從模型中檢索,如果不存在,它應該首先實體化,然后添加到模型中,一旦出現在模型中,引數欄位應該從具有匹配名稱的所有請求引數中填充,
三、@RequestParam和@ModelAttribute的區別
- @ModelAttribute:系結整個Java物件(如Employee),支持多個請求引數
- @RequestParam:結合一個單一的請求引數(像的firstName)
- @RequestParam是最適合讀出一小則params的,
- @ModelAttribute用于具有大量欄位的表單,
- @ModelAttribute為您提供了額外的功能,如資料系結,驗證和形式預先填充,
- 當同時使用@RequestParam()和@RequestBody時,@RequestParam()指定的引數可以是普通元素、陣列、集合、物件等等
四、@RequestBody
1、@RequestBody簡介
@RequestBody主要用來接收前端傳遞給后端的json字串中的資料的(請求體中的資料的);
@RequestBody用于post請求,不能用于get請求,
注:一個請求,只有一個RequestBody;一個請求,可以有多個RequestParam,
注:當同時使用@RequestParam()和@RequestBody時,@RequestParam()指定的引數可以是普通元素、陣列、集合、物件等等(即:當,@RequestBody 與@RequestParam()可以同時使用時,原SpringMVC接收引數的機制不變,只不過RequestBody 接收的是請求體里面的資料;而RequestParam接收的是key-value里面的引數,所以它會被切面進行處理從而可以用普通元素、陣列、集合、物件等接收),
即:如果引數時放在請求體中,application/json傳入后臺的話,那么后臺要用@RequestBody才能接收到;
如果不是放在請求體中的話,那么后臺接收前臺傳過來的引數時,要用@RequestParam來接收,或形參前什么也不寫也能接收,
如果后端引數是一個物件,且該引數前是以@RequestBody修飾的,那么前端傳遞json引數時,必須滿足以下要求:
- 后端@RequestBody注解對應的類在將HTTP的輸入流(含請求體)裝配到目標類(即:@RequestBody后面的類)時,會根據json字串中的key來匹配對應物體類的屬性,如果匹配一致且json中的該key對應的值符合(或可轉換為), 物體類的對應屬性的型別要求時,會呼叫物體類的setter方法將值賦給該屬性,
- json字串中,如果value為""的話,后端對應屬性如果是String型別的,那么接受到的就是"",如果是后端屬性的型別是Integer、Double等型別,那么接收到的就是null,
- json字串中,如果value為null的話,后端對應收到的就是null,
- 如果某個引數沒有value的話,在傳json字串給后端時,要么干脆就不把該欄位寫到json字串中;要么寫value時, 必須有值,null 或""都行,
2、傳入list
@GetMapping("/getUserLogin")
public String getUserLogin(@RequestBody UserLogin userLogin,
@RequestParam("arrays") List<String> arrays){
StringBuilder sb = new StringBuilder();
for(String array : arrays){
sb.append(array);
sb.append(",");
}
return sb + "," + userLogin;
}
3、核心邏輯分析
@RequestBody接受json時,核心邏輯分析示例
假設前端傳的json串是這樣的: {"name1":"素小暖","age":18} 后端的模型只有name和age屬性,以及對應的setter/getter方法;給出一般用到的deserializeFromObject(JsonParser p, DeserializationContext ctxt)方法的核心邏輯:

//前提是前端傳入的是json資料
//@JsonAlias表示當進行前端介面呼叫的時候,user中username傳入"userName","userName","UserName"都可接收
//@JsonProperty表示只能傳入passWord,password都無法進行呼叫
@Data
public class User{
@JsonAlias(value={"userName","userName","UserName"})
private String username;
@JsonProperty(value="passWord")
private String password;
}
@PostMapping("/getUserLogin")
public User getUserLogin(@RequestBody User user){
...
}
注意:
- @JsonAlias注解需要依賴于setter、getter,而@JsonProperty注解不需要,
- 在不考慮上述兩個注解的一般情況下,key與屬性匹配時,默認大小寫敏感,
- 有多個相同的key的json字串中,轉換為模型時,會以相同的幾個key中,排在最后的那個key的值給模型屬性復制,因為setter會覆寫原來的值,
- 后端@RequestBody注解對應的類在將HTTP的輸入流(含請求體)裝配到目標(即:@RequestBody后面的類)時,會根據json字串中的key來匹配對應物體類的屬性,如果匹配一致且json中的該key對應的值符合(或可轉換為)物體類的對應屬性的型別要求時,會呼叫物體類的setter方法將值賦給該屬性,
上一篇:【全堆疊最全Java框架總結】SSH、SSM、Springboot
下一篇:SpringCloud學習總綱
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245658.html
標籤:java
下一篇:化堆疊為隊Java版(力扣)
