使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)
如題,這里介紹springboot 獲取控制器參數(shù)有四種方式
1、無(wú)注解下獲取參數(shù)
2、使用@RequestParam獲取參數(shù)
3、傳遞數(shù)組
4、通過URL傳遞參數(shù)
無(wú)注解下獲取參數(shù)
無(wú)注解下獲取參數(shù),需要控制器層參數(shù)與HTTP請(qǐng)求欄參數(shù)名稱一致,這樣后臺(tái)就可以獲取到請(qǐng)求欄的參數(shù)。
/**
* 無(wú)注解獲取參數(shù)時(shí),參數(shù)名稱和HTTP請(qǐng)求參數(shù)必須一致
* @param name String 姓名
* @param age int 年齡
* @param score double 分?jǐn)?shù)
* @return 響應(yīng)json字符-@ResponseBody注解將map轉(zhuǎn)為json
*/
@RequestMapping("/param/noannotation")
@ResponseBody
public Map<String, Object> noAnnotation(String name,int age, double score) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name", name);
paramMap.put("age", age);
paramMap.put("score", score);
return paramMap;
}
方法中,我們接收三個(gè)參數(shù),分別為name,age和score
啟動(dòng)springboot后,在瀏覽器中請(qǐng)求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1
前端頁(yè)面會(huì)自動(dòng)得到我們輸入的參數(shù)的json形式

如果我們的請(qǐng)求URL中name不給參數(shù)值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1
請(qǐng)求可以正常跳轉(zhuǎn)

如果我們將int 或 long 參數(shù)為空,給URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=
請(qǐng)求會(huì)報(bào)錯(cuò)

無(wú)法將String型參數(shù)轉(zhuǎn)化為需要的double型。
這里可以看出,如果我們不給參數(shù)賦值,那么spring會(huì)將空著的參數(shù)默認(rèn)按照String型空字符串處理。所以,如果是String型的參數(shù),為空時(shí)不報(bào)錯(cuò)的;若是非String型參數(shù),則必須非空。
使用@RequestParam獲取參數(shù)
上面的無(wú)注解情況下,HTTP參數(shù)與控制器參數(shù)名稱必須一致。若HTTP參數(shù)與控制器參數(shù)不一致時(shí),我們就需要將前端參數(shù)與后端參數(shù)對(duì)應(yīng)起來(lái),這里我們使用@RequestParam來(lái)確定前后端參數(shù)名稱的映射關(guān)系。
/**
* 使用@RequestParam獲取參數(shù)
* 這里RequestParam注解會(huì)將括號(hào)里面的前端參數(shù)名稱轉(zhuǎn)化為后面的參數(shù)名稱
* @param name String 姓名,接收前端username參數(shù)
* @param age int 年齡,接收前端user_age參數(shù)
* @param score double 分?jǐn)?shù),接收前端score參數(shù)
* @return 響應(yīng)json字符
*/
@RequestMapping("/param/requestparam")
@ResponseBody
public Map<String, Object> requestParam(
@RequestParam("username") String name,
@RequestParam("user_age") int age,
@RequestParam("score") double score) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name", name);
paramMap.put("age", age);
paramMap.put("score", score);
return paramMap;
}
方法中,我們接收前端的username,user_age和score,然后使用@RequestParam注解將其轉(zhuǎn)化映射為name,age和age。
啟動(dòng)springboot后,URL欄輸入 http://localhost:8080/param/requestparam?username=lisi&user_age=12&score=45.6
可以正常跳轉(zhuǎn),并將結(jié)果展示在前端

如果將URL中username后面值置空,頁(yè)面可以正常跳轉(zhuǎn),測(cè)試URL
http://localhost:8080/param/requestparam?username=&user_age=12&score=45.6

若我們將user_age 或 score值置空,則頁(yè)面會(huì)報(bào)錯(cuò)

與上面無(wú)注解時(shí)錯(cuò)誤相同,這里不做解釋了。
如果我們刪除掉URL欄里面username參數(shù)項(xiàng),URL為 http://localhost:8080/param/requestparam?user_age=12&score=45.6
頁(yè)面無(wú)法正常跳轉(zhuǎn),報(bào)錯(cuò)如下

那如果實(shí)際中,我們確實(shí)有前端可傳可不傳的參數(shù)時(shí),怎么辦?@RequestParam注解給了一個(gè)required屬性,標(biāo)注該參數(shù)項(xiàng)是否必須有,其默認(rèn)值為true,即必須傳值;若該值可能為空,則將required置為false。注意,此時(shí),@RequestParam后面的數(shù)據(jù)類型必須為包裝類型,不可以是簡(jiǎn)單類型,若為簡(jiǎn)單類型,依然會(huì)報(bào)錯(cuò)。包裝類型時(shí),可以接收null對(duì)象;若為簡(jiǎn)單類型,則系統(tǒng)依然會(huì)將空字符串與對(duì)應(yīng)的簡(jiǎn)單類型進(jìn)行強(qiáng)轉(zhuǎn),轉(zhuǎn)換失敗的,則拋異常出來(lái)。
我們將上面方法參數(shù)做部分修改,修改如下,由于篇幅關(guān)系,這里不再整體貼整個(gè)方法
@RequestMapping("/param/requestparam")
@ResponseBody
public Map<String, Object> requestParam(
@RequestParam("username") String name,
@RequestParam(value = "user_age", required = false) Integer age,
@RequestParam(value = "score", required = false) double score) {
上面,我們將age對(duì)應(yīng)的類型修改為Integer包裝類型,required設(shè)置為false;score,只是設(shè)置required設(shè)置為false
啟動(dòng)springboot做測(cè)試,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=89
這里我們將user_age后面的參數(shù)值設(shè)置為空,請(qǐng)求可以正常跳轉(zhuǎn)

我們?cè)傩薷囊幌耈RL參數(shù)項(xiàng),http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=
系統(tǒng)會(huì)報(bào)400錯(cuò)誤,提示score是空字符串,如果將數(shù)據(jù)類型double修改為Double,就會(huì)返回null了,這個(gè)這里就不測(cè)試了

接收前端傳遞的數(shù)組
springMVC中,前端往后端除了可以傳遞一些單值外,也可以傳遞數(shù)組。傳遞數(shù)據(jù)部分沒有太多規(guī)則可言,在后臺(tái)控制器部分,定義數(shù)組形式接收數(shù)據(jù),前端傳遞時(shí),將一組數(shù)據(jù)用英文的逗號(hào)“,”隔開就可以了。
@RequestMapping("/param/requestarray")
@ResponseBody
public Map<String, Object> requestArray(String[] names, int[] ages, double[] scores) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name", names);
paramMap.put("age", ages);
paramMap.put("score", scores);
return paramMap;
}
啟動(dòng)springboot,URL為
http://localhost:8080/param/requestarray?names=zhangsan,lisi,wangwu&ages=12,14,15&scores=78.9,98,67
我們使用names接收所有的name,多個(gè)name值“zhangsan”、“l(fā)isi”和“wangwu”之間用“,”隔開
頁(yè)面可以正常跳轉(zhuǎn)

通過URL傳遞參數(shù)
這里通過URL傳遞參數(shù)與上面的URL不同,上面的URL中均需寫明參數(shù)名和對(duì)應(yīng)參數(shù)值,這里的URL傳遞參數(shù),僅需要在地址欄輸入?yún)?shù)值,然后后臺(tái)自動(dòng)匹配到對(duì)應(yīng)的參數(shù)名。springMVC通過使用處理器映射和@PathVariable注解的組合來(lái)獲取URL參數(shù)。首先通過處理器映射可以定位參數(shù)的位置和名稱,而@PathVariable則可以通過名稱來(lái)獲取參數(shù)。
/**
* 使用URL傳參
* URL傳參時(shí),方法請(qǐng)求URL后使用{}包含參數(shù)名稱,多個(gè)參數(shù)之間使用/分隔
* @param name 姓名
* @param age 年齡
* @param score 成績(jī)
* @return 響應(yīng)的json數(shù)據(jù)
*/
@RequestMapping("/param/geturl/{name}/{age}/{score}")
@ResponseBody
public Map<String, Object> getUrlParam(
@PathVariable("name") String name,
@PathVariable("age") Integer age,
@PathVariable("score") Double score) {
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name", name);
paramMap.put("age", age);
paramMap.put("score", score);
return paramMap;
}
方法中,我們使用了3個(gè){ },分別代表變量name、age和score,方法變量中使用@PathVariable來(lái)接收變量,并映射為方法的變量
啟動(dòng)springboot測(cè)試,URL為 http://localhost:8080/param/geturl/zhangsan/12/89
正常跳轉(zhuǎn)

如果中間某個(gè)參數(shù)可能為空呢,查了下@PathVariable注解有required屬性,但是經(jīng)測(cè)試,發(fā)現(xiàn)這個(gè)屬性無(wú)法單獨(dú)使用。
如果中間某個(gè)參數(shù)為空,還得借用@RequestMapping 支持多URL的屬性進(jìn)行處理
假如,age屬性可能為空,那么修改代碼為
@RequestMapping(value = {"/param/geturl/{name}/{age}/{score}",
"/param/geturl/{name}/{score}"})
@ResponseBody
public Map<String, Object> getUrlParam(
@PathVariable("name") String name,
@PathVariable(value = "age", required = false) Integer age,
@PathVariable("score") Double score) {
其中,后面的URL中沒有了age參數(shù),這里,視有無(wú)age的請(qǐng)求為不同的請(qǐng)求
使用URL http://localhost:8080/param/geturl/zhangsan//89 做測(cè)試,可以正常跳轉(zhuǎn)

以上介紹的四種獲取前端參數(shù)的四種方式,內(nèi)容均為本人學(xué)習(xí)整理所得,若其中有不嚴(yán)謹(jǐn)之處,歡迎批評(píng)斧正。關(guān)于獲取前端參數(shù),不止上面四種方式,就了解到的還有獲取json和格式化參數(shù)兩種形式,由于涉及頁(yè)面內(nèi)容,本篇博文暫時(shí)不做介紹,后面單獨(dú)整理。 希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
spring的pointcut正則表達(dá)式的實(shí)現(xiàn)
本文主要介紹了spring的pointcut正則表達(dá)式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
使用Spring boot + jQuery上傳文件(kotlin)功能實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了使用Spring boot + jQuery上傳文件(kotlin) 功能,需要的朋友可以參考下2017-07-07
Java中的HashSet、LinkedHashSet集合解析
這篇文章主要介紹了Java中的HashSet、LinkedHashSet集合解析,與HashSet不同的是,LinkedHashSet在內(nèi)部使用了一個(gè)雙向鏈表來(lái)維護(hù)元素的順序,因此它可以保持元素的插入順序,這使得LinkedHashSet在需要保持元素順序的場(chǎng)景下非常有用,需要的朋友可以參考下2023-11-11
Mybatis-Plus中的@TableName 和 table-prefix使用
table-prefix 是一個(gè)全局配置,它會(huì)自動(dòng)在所有表名前添加指定的前綴,這個(gè)配置對(duì)于那些使用一致命名約定的數(shù)據(jù)庫(kù)表非常有用,這篇文章主要介紹了Mybatis-Plus中的@TableName 和 table-prefix使用,需要的朋友可以參考下2024-08-08
詳解如何用spring Restdocs創(chuàng)建API文檔
這篇文章將帶你了解如何用spring官方推薦的restdoc去生成api文檔。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Java函數(shù)式開發(fā) Optional空指針處理
本文主要介紹Java函數(shù)式開發(fā) Optional空指針處理,這里整理了相關(guān)資料,及示例代碼,有興趣的小伙伴可以參考下2016-09-09
java對(duì)象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式舉例
開發(fā)小伙伴們通常會(huì)需要使用到對(duì)象和Map互相轉(zhuǎn)換的開發(fā)場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于java對(duì)象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式,需要的朋友可以參考下2024-01-01
java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來(lái)介紹一下java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

