springboot 获取控制器参数的几种方式
這里介紹springboot 獲取控制器參數(shù)有四種方式
1、無注解下獲取參數(shù)
2、使用@RequestParam獲取參數(shù)
3、傳遞數(shù)組
4、通過URL傳遞參數(shù)
?
無注解下獲取參數(shù)
無注解下獲取參數(shù),需要控制器層參數(shù)與HTTP請求欄參數(shù)名稱一致,這樣后臺就可以獲取到請求欄的參數(shù)。
/**
* 無注解獲取參數(shù)時,參數(shù)名稱和HTTP請求參數(shù)必須一致
* @param name String 姓名
* @param age int 年齡
* @param score double 分數(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;
}
方法中,我們接收三個參數(shù),分別為name,age和score
啟動springboot后,在瀏覽器中請求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1
前端頁面會自動得到我們輸入的參數(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=
請求會報錯?無法將String型參數(shù)轉(zhuǎn)化為需要的double型。
這里可以看出,如果我們不給參數(shù)賦值,那么spring會將空著的參數(shù)默認按照String型空字符串處理。所以,如果是String型的參數(shù),為空時不報錯的;若是非String型參數(shù),則必須非空。
?這里可以用引用類型 比如:用Integer=>int 就行 下面我對于這個問題我就不說了。
使用@RequestParam獲取參數(shù)
上面的無注解情況下,HTTP參數(shù)與控制器參數(shù)名稱必須一致。若HTTP參數(shù)與控制器參數(shù)不一致時,我們就需要將前端參數(shù)與后端參數(shù)對應(yīng)起來,這里我們使用@RequestParam來確定前后端參數(shù)名稱的映射關(guān)系。
/**
* 使用@RequestParam獲取參數(shù)
* 這里RequestParam注解會將括號里面的前端參數(shù)名稱轉(zhuǎn)化為后面的參數(shù)名稱
* @param name String 姓名,接收前端username參數(shù)
* @param age int 年齡,接收前端user_age參數(shù)
* @param score double 分數(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。
啟動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值置空,則頁面會報錯
?
與上面無注解時錯誤相同,這里不做解釋了。
如果我們刪除掉URL欄里面username參數(shù)項,URL為?http://localhost:8080/param/requestparam?user_age=12&score=45.6
頁面無法正常跳轉(zhuǎn),報錯如下
?
那如果實際中,我們確實有前端可傳可不傳的參數(shù)時,怎么辦?@RequestParam注解給了一個required屬性,標(biāo)注該參數(shù)項是否必須有,其默認值為true,即必須傳值;若該值可能為空,則將required置為false。注意,此時,@RequestParam后面的數(shù)據(jù)類型必須為包裝類型,不可以是簡單類型,若為簡單類型,依然會報錯。包裝類型時,可以接收null對象;若為簡單類型,則系統(tǒng)依然會將空字符串與對應(yīng)的簡單類型進行強轉(zhuǎn),轉(zhuǎn)換失敗的,則拋異常出來。
我們將上面方法參數(shù)做部分修改,修改如下,由于篇幅關(guān)系,這里不再整體貼整個方法
@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
啟動springboot做測試,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=89
這里我們將user_age后面的參數(shù)值設(shè)置為空,請求可以正常跳轉(zhuǎn)
?
我們再修改一下URL參數(shù)項,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=
系統(tǒng)會報400錯誤,提示score是空字符串,如果將數(shù)據(jù)類型double修改為Double,就會返回null了,這個這里就不測試了
?
?
接收前端傳遞的數(shù)組
springMVC中,前端往后端除了可以傳遞一些單值外,也可以傳遞數(shù)組。傳遞數(shù)據(jù)部分沒有太多規(guī)則可言,在后臺控制器部分,定義數(shù)組形式接收數(shù)據(jù),前端傳遞時,將一組數(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;
}
啟動springboot,URL為?
http://localhost:8080/param/requestarray?names=zhangsan,lisi,wangwu&ages=12,14,15&scores=78.9,98,67
我們使用names接收所有的name,多個name值“zhangsan”、“l(fā)isi”和“wangwu”之間用“,”隔開
頁面可以正常跳轉(zhuǎn)
?
?
通過URL傳遞參數(shù)
這里通過URL傳遞參數(shù)與上面的URL不同,上面的URL中均需寫明參數(shù)名和對應(yīng)參數(shù)值,這里的URL傳遞參數(shù),僅需要在地址欄輸入?yún)?shù)值,然后后臺自動匹配到對應(yīng)的參數(shù)名。springMVC通過使用處理器映射和@PathVariable注解的組合來獲取URL參數(shù)。首先通過處理器映射可以定位參數(shù)的位置和名稱,而@PathVariable則可以通過名稱來獲取參數(shù)。
/**
* 使用URL傳參
* URL傳參時,方法請求URL后使用{}包含參數(shù)名稱,多個參數(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個{ },分別代表變量name、age和score,方法變量中使用@PathVariable來接收變量,并映射為方法的變量
啟動springboot測試,URL為??http://localhost:8080/param/geturl/zhangsan/12/89
正常跳轉(zhuǎn)
?
如果中間某個參數(shù)可能為空呢,查了下@PathVariable注解有required屬性,但是經(jīng)測試,發(fā)現(xiàn)這個屬性無法單獨使用。
如果中間某個參數(shù)為空,還得借用@RequestMapping 支持多URL的屬性進行處理
假如,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)
轉(zhuǎn)載于:https://www.cnblogs.com/xiaowangbangzhu/p/10192445.html
總結(jié)
以上是生活随笔為你收集整理的springboot 获取控制器参数的几种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福禄克网络TIA识别MPTL连接的操作方
- 下一篇: HP常用函数总结(一):