使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)
如題,這里介紹springboot 獲取控制器參數(shù)有四種方式
1、無注解下獲取參數(shù)
2、使用@RequestParam獲取參數(shù)
3、傳遞數(shù)組
4、通過URL傳遞參數(shù)
無注解下獲取參數(shù)
無注解下獲取參數(shù),需要控制器層參數(shù)與HTTP請求欄參數(shù)名稱一致,這樣后臺就可以獲取到請求欄的參數(shù)。
/** * 無注解獲取參數(shù)時(shí),參數(shù)名稱和HTTP請求參數(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后,在瀏覽器中請求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1
前端頁面會(huì)自動(dòng)得到我們輸入的參數(shù)的json形式
如果我們的請求URL中name不給參數(shù)值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1
請求可以正常跳轉(zhuǎn)
如果我們將int 或 long 參數(shù)為空,給URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=
請求會(huì)報(bào)錯(cuò)
無法將String型參數(shù)轉(zhuǎn)化為需要的double型。
這里可以看出,如果我們不給參數(shù)賦值,那么spring會(huì)將空著的參數(shù)默認(rèn)按照String型空字符串處理。所以,如果是String型的參數(shù),為空時(shí)不報(bào)錯(cuò)的;若是非String型參數(shù),則必須非空。
使用@RequestParam獲取參數(shù)
上面的無注解情況下,HTTP參數(shù)與控制器參數(shù)名稱必須一致。若HTTP參數(shù)與控制器參數(shù)不一致時(shí),我們就需要將前端參數(shù)與后端參數(shù)對應(yīng)起來,這里我們使用@RequestParam來確定前后端參數(shù)名稱的映射關(guān)系。
/** * 使用@RequestParam獲取參數(shù) * 這里RequestParam注解會(huì)將括號里面的前端參數(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后面值置空,頁面可以正常跳轉(zhuǎn),測試URL
http://localhost:8080/param/requestparam?username=&user_age=12&score=45.6
若我們將user_age 或 score值置空,則頁面會(huì)報(bào)錯(cuò)
與上面無注解時(shí)錯(cuò)誤相同,這里不做解釋了。
如果我們刪除掉URL欄里面username參數(shù)項(xiàng),URL為 http://localhost:8080/param/requestparam?user_age=12&score=45.6
頁面無法正常跳轉(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ù)類型必須為包裝類型,不可以是簡單類型,若為簡單類型,依然會(huì)報(bào)錯(cuò)。包裝類型時(shí),可以接收null對象;若為簡單類型,則系統(tǒng)依然會(huì)將空字符串與對應(yīng)的簡單類型進(jìn)行強(qiáng)轉(zhuǎn),轉(zhuǎn)換失敗的,則拋異常出來。
我們將上面方法參數(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對應(yīng)的類型修改為Integer包裝類型,required設(shè)置為false;score,只是設(shè)置required設(shè)置為false
啟動(dòng)springboot做測試,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=89
這里我們將user_age后面的參數(shù)值設(shè)置為空,請求可以正常跳轉(zhuǎn)
我們再修改一下URL參數(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è)這里就不測試了
接收前端傳遞的數(shù)組
springMVC中,前端往后端除了可以傳遞一些單值外,也可以傳遞數(shù)組。傳遞數(shù)據(jù)部分沒有太多規(guī)則可言,在后臺控制器部分,定義數(shù)組形式接收數(shù)據(jù),前端傳遞時(shí),將一組數(shù)據(jù)用英文的逗號“,”隔開就可以了。
@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”之間用“,”隔開
頁面可以正常跳轉(zhuǎn)
通過URL傳遞參數(shù)
這里通過URL傳遞參數(shù)與上面的URL不同,上面的URL中均需寫明參數(shù)名和對應(yīng)參數(shù)值,這里的URL傳遞參數(shù),僅需要在地址欄輸入?yún)?shù)值,然后后臺自動(dòng)匹配到對應(yīng)的參數(shù)名。springMVC通過使用處理器映射和@PathVariable注解的組合來獲取URL參數(shù)。首先通過處理器映射可以定位參數(shù)的位置和名稱,而@PathVariable則可以通過名稱來獲取參數(shù)。
/** * 使用URL傳參 * URL傳參時(shí),方法請求URL后使用{}包含參數(shù)名稱,多個(gè)參數(shù)之間使用/分隔 * @param name 姓名 * @param age 年齡 * @param score 成績 * @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來接收變量,并映射為方法的變量
啟動(dòng)springboot測試,URL為 http://localhost:8080/param/geturl/zhangsan/12/89
正常跳轉(zhuǎn)
如果中間某個(gè)參數(shù)可能為空呢,查了下@PathVariable注解有required屬性,但是經(jīng)測試,發(fā)現(xiàn)這個(gè)屬性無法單獨(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ù),這里,視有無age的請求為不同的請求
使用URL http://localhost:8080/param/geturl/zhangsan//89 做測試,可以正常跳轉(zhuǎn)
以上介紹的四種獲取前端參數(shù)的四種方式,內(nèi)容均為本人學(xué)習(xí)整理所得,若其中有不嚴(yán)謹(jǐn)之處,歡迎批評斧正。關(guān)于獲取前端參數(shù),不止上面四種方式,就了解到的還有獲取json和格式化參數(shù)兩種形式,由于涉及頁面內(nèi)容,本篇博文暫時(shí)不做介紹,后面單獨(dú)整理。 希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java源碼解析重寫鎖的設(shè)計(jì)結(jié)構(gòu)和細(xì)節(jié)
這篇文章主要為大家介紹了Java源碼解析重寫鎖的設(shè)計(jì)結(jié)構(gòu)和細(xì)節(jié),這小節(jié)我們以共享鎖作為案列,自定義一個(gè)共享鎖。有需要的朋友可以借鑒參考下2022-03-03Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式
這篇文章主要介紹了Java中Arrays.sort自定義一維數(shù)組、二維數(shù)組的排序方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢
這篇文章主要介紹了Mybatis-Plus insertBatch執(zhí)行緩慢的原因查詢,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11詳解使用Spring Boot開發(fā)Web項(xiàng)目
這篇文章主要介紹了詳解使用Spring Boot開發(fā)Web項(xiàng)目,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04java實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)省市區(qū)三級聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06