Spring MVC請求參數(shù)的傳遞方式
1. 傳遞單個參數(shù)
接收單個參數(shù),直接在方法中加入?yún)?shù)即可
@RequestMapping("/param")
@RestController
public class ParamController {
@RequestMapping("/m1")
public String method1(String name){
return "接收到參數(shù)name: " + name;
}
}
在傳遞參數(shù)的時候,代碼中的參數(shù)名稱需要和請求的參數(shù)名稱是一致的

如果傳入的參數(shù)是整形呢,整數(shù)的話是可以用 Integer 和 int 來表示的,下面來演示一下

@RequestMapping("/m2")
public String method2(Integer age){
return "接收到參數(shù)age: " + age;
}
@RequestMapping("/m3")
public String method3(int age){
return "接收到參數(shù)age: " + age;
}那么他們的區(qū)別是什么呢?
接下來試著不傳參,發(fā)現(xiàn) int 定義的參數(shù)是直接報錯了,Integer 定義的是可以接受 null 的

并且無論是 int 還是 Integer,傳入的參數(shù)一定要對應(yīng),否則也會報錯

錯誤日志上描述的是 String 類型轉(zhuǎn)化為其他類型失敗,傳遞的普通參數(shù),默認(rèn)的類型是 String ,后端接收時根據(jù)定義的類型再進(jìn)行相應(yīng)的轉(zhuǎn)化

int 等一些基本數(shù)據(jù)類型不能傳入 null,不過 boolean 是可以傳入 null 的
@RequestMapping("/m4")
public String method4(Boolean gender){
return "接收到參數(shù)gender: " + gender;
}
@RequestMapping("/m5")
public String method5(boolean gender){
return "接收到參數(shù)gender: " + gender;
}
可以看出,如果不傳參數(shù)的話,Boolean 接收到的是 null,boolean 接收到的 false,boolean 類型默認(rèn)就是 false
2. 傳遞多個參數(shù)
多個參數(shù)也是可以直接傳遞的,并且不需要保證傳參的順序,只需要參數(shù)名對應(yīng)即可
@RequestMapping("/m6")
public String method6(String name,Integer age){
return "接收到參數(shù)name: " + name + "," + "age: " + age ;
}
再傳遞幾個參數(shù)也是可以的,不過這種方式傳遞這么多參數(shù)就有些麻煩了,可以通過傳遞對象的方式可以傳入多個參數(shù)
創(chuàng)建一個 User 的類(重寫了 toString() 方法)之后再進(jìn)行對象的傳遞
@RequestMapping("/m7")
public String method7(User user){
return "接收到參數(shù)user: " + user;
}
通過傳入對象的方式就可以進(jìn)行多個參數(shù)的傳遞,在之前,如果 int 類型參數(shù)沒有傳的話是會報錯的,如果對象中使用 int 類型來描述屬性的話,傳遞參數(shù)時不傳也不會報錯:

因?yàn)?age 是成員變量,是有默認(rèn)值的,即使如此,還是建議使用包裝類型,可以避免一些難以預(yù)料的問題
3. 參數(shù)重命名
在上面提到過,前端傳遞的參數(shù)要和后端方法里的參數(shù)保持一致,而前端可能會傳入各種各樣的參數(shù),比如 userName, productName 等,后端如果只想要一個 name 的話可以對前端傳遞的參數(shù)進(jìn)行重命名,把前端傳入的名稱都重命名為 name,后續(xù)就使用 name 進(jìn)行操作,這就需要使用到 @RequestParam注解
@RequestMapping("/m8")
public String method8(@RequestParam("userName") String name){
return "接收到參數(shù)name: " + name;
}@RequestParam就起到了參數(shù)綁定的作用,把前端的 userName 和后端的 name 進(jìn)行了綁定,那如果前端還是傳入 name 會怎么樣呢
直接報了一個 400 的錯誤,并且無論是傳入?yún)?shù)和名稱不對應(yīng)還是不傳遞參數(shù),都會報錯


意思就是傳遞 userName 的參數(shù),相當(dāng)于強(qiáng)制綁定
來看 @RequestParam的源碼:

value(或name)屬性:用于指定請求參數(shù)的名稱
required屬性:表示該參數(shù)是否必須在請求中存在。如果設(shè)置為true,當(dāng)請求中沒有這個參數(shù)時,會拋出異常。如果設(shè)置為false,則在請求中沒有該參數(shù)時,會使用默認(rèn)值(如果有設(shè)置默認(rèn)值)或者為null。
在使用@RequestParam注解時,如果只提供一個字符串參數(shù),它會被視為value(或name)屬性的值。
@RequestMapping("/m8")
public String method8(@RequestParam(value = "userName",required = false) String name){
return "接收到參數(shù)name: " + name;
}把 required 改為 false 不傳遞參數(shù)也不會報錯,會使用默認(rèn)值或者 null

4. 傳遞數(shù)組
@RequestMapping("/m9")
public String method9(String[] arr){
return "接收到參數(shù)name: " + List.of(arr);
}傳遞數(shù)組的方式是有兩種的,第一種就是直接傳入數(shù)組中的數(shù)據(jù),第二種就是傳入多個數(shù)據(jù),參數(shù)一致

那么第一種傳入的數(shù)據(jù)是按照字符來傳的還是按照數(shù)組中的三個元素來傳的

調(diào)試一下發(fā)現(xiàn)是按照數(shù)組元素的形式自動切割了
5. 傳遞集合
數(shù)組可以通過上面的方式傳,那么 List 行不行呢
@RequestMapping("/m10")
public String method10(List<String> list){
return "接收到參數(shù)list: " + list;
}這一次是直接報錯了,顯示 500 的狀態(tài)碼

拋出了異常,無法構(gòu)造一個 List

原因是發(fā)送上述請求時,默認(rèn)是把請求的參數(shù)封裝成數(shù)組的,并不是一個 List,所以需要進(jìn)行參數(shù)綁定,也就是把數(shù)組轉(zhuǎn)化為 List
@RequestMapping("/m10")
public String method10(@RequestParam List<String> list){
return "接收到參數(shù)list: " + list;
}
6. 傳遞 JSON 數(shù)據(jù)
6.1. JSON 語法
- 數(shù)據(jù)在鍵值對(Key/Value)中;
- 數(shù)據(jù)由逗號 , 分隔;
- 對象用 {} 表示;
- 數(shù)組用 [] 表示;
- 值可以為對象,也可以為數(shù)組,數(shù)組中可以包含多個對象。


接下來看 JSON 是怎么轉(zhuǎn)化為 java 對象的:
使用 ObjectMapper 對象提供的兩個?法,可以完成對象和 JSON 字符串的互轉(zhuǎn)。
writeValueAsString:把對象轉(zhuǎn)為 JSON 字符串。
readValue:把字符串轉(zhuǎn)為對象。
public class JsonTest {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
User user = new User();
user.setName("zhangsan");
user.setGender(1);
user.setAge(18);
//對象轉(zhuǎn)JSON
String s = objectMapper.writeValueAsString(user);
System.out.println(s);
//JSON轉(zhuǎn)對象
User user1 = objectMapper.readValue(s,User.class);
System.out.println(user1);
}
}
6.2. 傳遞 JSON
傳遞 JSON 參數(shù)是通過@RequestBody注解來實(shí)現(xiàn)的,從請求正文中獲取數(shù)據(jù)
@RequestMapping("/m11")
public String method11(@RequestBody User user){
return "接收到參數(shù)user: " + user;
}可以看出,請求的數(shù)據(jù)格式是不同的

以上就是Spring MVC請求參數(shù)的傳遞方式的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC請求參數(shù)傳遞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)同態(tài)加密算法的實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)同態(tài)加密算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
SpringBoot下載Excel文件時,報錯文件損壞的解決方案
這篇文章主要介紹了SpringBoot下載Excel文件時,報錯文件損壞的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Windows中使用Java生成Excel文件并插入圖片的方法
這篇文章主要介紹了Windows中使用Java生成Excel文件并插入圖片的方法,其中向Excel中插入圖片文中通過使用Apache POI來實(shí)現(xiàn),需要的朋友可以參考下2016-02-02
SpringBoot下無節(jié)制和數(shù)據(jù)庫建立連接的問題及解決方法
本文介紹了無節(jié)制建立MySQL連接的危害,包括數(shù)據(jù)庫服務(wù)端資源耗盡、應(yīng)用端性能劣化和監(jiān)控與運(yùn)維困境,提出了系統(tǒng)性解決方案,包括連接池標(biāo)準(zhǔn)化配置、代碼規(guī)范與防御式編程、全鏈路監(jiān)控體系和架構(gòu)級優(yōu)化,感興趣的朋友一起看看吧2025-03-03

