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ù)時不傳也不會報錯:
因為 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
注解來實現(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)文章
SpringBoot下載Excel文件時,報錯文件損壞的解決方案
這篇文章主要介紹了SpringBoot下載Excel文件時,報錯文件損壞的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06Windows中使用Java生成Excel文件并插入圖片的方法
這篇文章主要介紹了Windows中使用Java生成Excel文件并插入圖片的方法,其中向Excel中插入圖片文中通過使用Apache POI來實現(xiàn),需要的朋友可以參考下2016-02-02SpringBoot下無節(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