SpringMVC—請求傳參
1. 傳遞對象
如果參數比較多時,方法聲明就需要有很多形參;并且后續每次新增一個參數,也需要修改方法聲明.
我們不妨把這些參數封裝為一個對象
;
Spring MVC 也可以自動實現對象參數的賦值,比如 Userinfo 對象:
我們對 Userinfo 定義屬性:name ,gender ,age,并且通過下列方式,重寫 getter
,setter
,toString
方法:
package com.example.springmvc_demo;public class Userinfo {private String name;private Integer gender;private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Userinfo{" +"name='" + name + '\'' +", gender=" + gender +", age=" + age +'}';}
}
傳遞對象代碼實現:
我們啟動程序,通過 Postman 構造請求:
如果我們把屬性的 Integer 設置成 int,并且不傳值 (取消勾選),也不會報錯,默認為0;
我們在傳遞對象時,設置的屬性名字,必須與后端代碼中的對應屬性的名字相同!
2. 后端參數重命名(后端參數映射)
某些特殊的情況下,前端傳遞的參數 key 和我們后端接收的key可以不一致;
比如
前端
傳遞了一個 kw 給后端,而后端
是使用 keyword 字段來接收的;這樣就會出現參數接收不到的情況;
如果出現這種情況,我們就可以使用
@RequestParam
來重命名前后端的參數值
具體示例如下,后端實現代碼:
使用 Postman 發送請求并傳參,通過傳參結果我們可以知道,對于前端命名的 kw
是可以正確傳參的:
但是,如果我們使用后端命名的 keyword
,則無法傳參:
我們查看錯誤日志:
報錯信息的意思是:方法參數類型的所需請求參數‘kw’不存在
因此,我們加了注解 @RequestParam("kw")
后, kw 這個參數就是必須傳遞的了;
但是我們剛剛在 Postman 構造請求時,并沒有使用 kw 參數,keyword 是前端的 kw 賦值的,而不是r6 方法中,傳入的參數 keyword
;
結論:
使用
@RequestParam
進行參數重命名時,請求參數
只能和@RequestParam
聲明的名稱一致
,才能進行參數綁定和賦值;使用
@RequestParam
進行參數重命名時,參數就變成了必傳參數
;
3. 非必傳參數設置
如果我們的實際業務前端的參數是一個非必傳的參數
,針對上述問題,如何解決呢?
先來了解下參數必傳的原因
,我們查看@RequestParam
注解的實現細節,就可以發現端倪,注解實現如下:
可以看到 required
的默認值為 true
,表示含義就是:該注解修飾的參數默認為必傳
既然如此,我們可以通過設置 @RequestParam
中的 required=false
來避免不傳遞時報錯;
具體實現如下:
可以看到,添加 required=false
之后,kw 前面也加了key,變成了 value =“kw”
注解屬性賦值時,沒有指明key的話,默認為 value 屬性;
如果需要有多個屬性進行賦值時,需要寫上 key
重寫運行程序,再次使用 Postman 發送請求,響應結果的值雖然為 null,但是沒有報錯:
4. 傳遞數組
Spring MVC可以自動綁定數組參數的賦值,后端實現代碼:
注意打印數組的 Arrays.toString(kunkunLike)
打開 Postman ,重新構造數組請求:
也可以這樣:
5. 傳遞集合
運行程序,使用 Postman 發送請求:
說明如果要傳遞集合,我們的后端代碼是不可以這樣寫的;
我們查看錯誤日志:
錯誤日志的意思是:沒有為接口java.util.List找到主要的或唯一的構造函數
但是錯誤日志并不是根本原因,要想解決問題,傳遞參數,我們就需要使用@RequestParam綁定參數關系
集合參數:
- 和數組類似,同一個請求參數名有為多個,且需要
使用@RequestParam綁定參數關系
默認情況下,請求中
參數名相同的多個值
,是封裝到數組
;如果要封裝到
集合
,要使用@RequestParam綁定參數關系
請求方式和數組類似: