Spring MVC請(qǐng)求參數(shù)的傳遞方式
1. 傳遞單個(gè)參數(shù)
接收單個(gè)參數(shù),直接在方法中加入?yún)?shù)即可
@RequestMapping("/param")
@RestController
public class ParamController {
@RequestMapping("/m1")
public String method1(String name){
return "接收到參數(shù)name: " + name;
}
}
在傳遞參數(shù)的時(shí)候,代碼中的參數(shù)名稱需要和請(qǐng)求的參數(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ù)是直接報(bào)錯(cuò)了,Integer 定義的是可以接受 null 的

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

錯(cuò)誤日志上描述的是 String 類型轉(zhuǎn)化為其他類型失敗,傳遞的普通參數(shù),默認(rèn)的類型是 String ,后端接收時(shí)根據(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. 傳遞多個(gè)參數(shù)
多個(gè)參數(shù)也是可以直接傳遞的,并且不需要保證傳參的順序,只需要參數(shù)名對(duì)應(yīng)即可
@RequestMapping("/m6")
public String method6(String name,Integer age){
return "接收到參數(shù)name: " + name + "," + "age: " + age ;
}
再傳遞幾個(gè)參數(shù)也是可以的,不過這種方式傳遞這么多參數(shù)就有些麻煩了,可以通過傳遞對(duì)象的方式可以傳入多個(gè)參數(shù)
創(chuàng)建一個(gè) User 的類(重寫了 toString() 方法)之后再進(jìn)行對(duì)象的傳遞
@RequestMapping("/m7")
public String method7(User user){
return "接收到參數(shù)user: " + user;
}
通過傳入對(duì)象的方式就可以進(jìn)行多個(gè)參數(shù)的傳遞,在之前,如果 int 類型參數(shù)沒有傳的話是會(huì)報(bào)錯(cuò)的,如果對(duì)象中使用 int 類型來描述屬性的話,傳遞參數(shù)時(shí)不傳也不會(huì)報(bào)錯(cuò):

因?yàn)?age 是成員變量,是有默認(rèn)值的,即使如此,還是建議使用包裝類型,可以避免一些難以預(yù)料的問題
3. 參數(shù)重命名
在上面提到過,前端傳遞的參數(shù)要和后端方法里的參數(shù)保持一致,而前端可能會(huì)傳入各種各樣的參數(shù),比如 userName, productName 等,后端如果只想要一個(gè) name 的話可以對(duì)前端傳遞的參數(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 會(huì)怎么樣呢
直接報(bào)了一個(gè) 400 的錯(cuò)誤,并且無論是傳入?yún)?shù)和名稱不對(duì)應(yīng)還是不傳遞參數(shù),都會(huì)報(bào)錯(cuò)


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

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

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

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

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

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

原因是發(fā)送上述請(qǐng)求時(shí),默認(rèn)是把請(qǐng)求的參數(shù)封裝成數(shù)組的,并不是一個(gè) 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ù)在鍵值對(duì)(Key/Value)中;
- 數(shù)據(jù)由逗號(hào) , 分隔;
- 對(duì)象用 {} 表示;
- 數(shù)組用 [] 表示;
- 值可以為對(duì)象,也可以為數(shù)組,數(shù)組中可以包含多個(gè)對(duì)象。


接下來看 JSON 是怎么轉(zhuǎn)化為 java 對(duì)象的:
使用 ObjectMapper 對(duì)象提供的兩個(gè)?法,可以完成對(duì)象和 JSON 字符串的互轉(zhuǎn)。
writeValueAsString:把對(duì)象轉(zhuǎn)為 JSON 字符串。
readValue:把字符串轉(zhuǎn)為對(duì)象。
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);
//對(duì)象轉(zhuǎn)JSON
String s = objectMapper.writeValueAsString(user);
System.out.println(s);
//JSON轉(zhuǎn)對(duì)象
User user1 = objectMapper.readValue(s,User.class);
System.out.println(user1);
}
}
6.2. 傳遞 JSON
傳遞 JSON 參數(shù)是通過@RequestBody注解來實(shí)現(xiàn)的,從請(qǐng)求正文中獲取數(shù)據(jù)
@RequestMapping("/m11")
public String method11(@RequestBody User user){
return "接收到參數(shù)user: " + user;
}可以看出,請(qǐng)求的數(shù)據(jù)格式是不同的

以上就是Spring MVC請(qǐng)求參數(shù)的傳遞方式的詳細(xì)內(nèi)容,更多關(guān)于Spring MVC請(qǐng)求參數(shù)傳遞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合flyway實(shí)現(xiàn)自動(dòng)創(chuàng)建表的方法
這篇文章主要介紹了SpringBoot整合flyway實(shí)現(xiàn)自動(dòng)創(chuàng)建表的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
一文教會(huì)你如何從0到1搭建一個(gè)SpringBoot項(xiàng)目
今天剛好學(xué)習(xí)到SpringBoot,就順便記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于如何從0到1搭建一個(gè)SpringBoot項(xiàng)目的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Java實(shí)現(xiàn)文件和base64流的相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)文件和base64流的相互轉(zhuǎn)換功能,涉及Java文件讀取及base64 轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Java?嵌入數(shù)據(jù)引擎從?SQLite?到?SPL詳解
這篇文章主要介紹了Java?嵌入數(shù)據(jù)引擎:從?SQLite?到?SPL,SQLite架構(gòu)簡(jiǎn)單,其核心雖然是C語言開發(fā)的,但封裝得比較好,對(duì)外呈現(xiàn)為一個(gè)小巧的Jar包,能方便地集成在Java應(yīng)用中,本文給大家介紹的非常詳細(xì),需要的朋友參考下2022-07-07

