這裏介紹springboot 獲取控制器參數有四種方式前端
一、無註解下獲取參數spring
二、使用@RequestParam獲取參數json
三、傳遞數組後端
四、經過URL傳遞參數數組
無註解下獲取參數
無註解下獲取參數,須要控制器層參數與HTTP請求欄參數名稱一致,這樣後臺就能夠獲取到請求欄的參數。瀏覽器
/**
* 無註解獲取參數時,參數名稱和HTTP請求參數必須一致
* @param name String 姓名
* @param age int 年齡
* @param score double 分數
* @return 響應json字符-@ResponseBody註解將map轉爲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;
}
方法中,咱們接收三個參數,分別爲name,age和scorespringboot
啓動springboot後,在瀏覽器中請求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1app
前端頁面會自動獲得咱們輸入的參數的json形式測試
若是咱們的請求URL中name不給參數值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1ui
請求能夠正常跳轉
若是咱們將int 或 long 參數爲空,給URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=
請求會報錯 沒法將String型參數轉化爲須要的double型。
這裏能夠看出,若是咱們不給參數賦值,那麼spring會將空着的參數默認按照String型空字符串處理。因此,若是是String型的參數,爲空時不報錯的;如果非String型參數,則必須非空。
這裏能夠用引用類型 好比:用Integer=>int 就行 下面我對於這個問題我就不說了。
使用@RequestParam獲取參數
上面的無註解狀況下,HTTP參數與控制器參數名稱必須一致。若HTTP參數與控制器參數不一致時,咱們就須要將前端參數與後端參數對應起來,這裏咱們使用@RequestParam來肯定先後端參數名稱的映射關係。
/**
* 使用@RequestParam獲取參數
* 這裏RequestParam註解會將括號裏面的前端參數名稱轉化爲後面的參數名稱
* @param name String 姓名,接收前端username參數
* @param age int 年齡,接收前端user_age參數
* @param score double 分數,接收前端score參數
* @return 響應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註解將其轉化映射爲name,age和age。
啓動springboot後,URL欄輸入 http://localhost:8080/param/requestparam?username=lisi&user_age=12&score=45.6
能夠正常跳轉,並將結果展現在前端
若是將URL中username後面值置空,頁面能夠正常跳轉,測試URL
http://localhost:8080/param/requestparam?username=&user_age=12&score=45.6
若咱們將user_age 或 score值置空,則頁面會報錯
與上面無註解時錯誤相同,這裏不作解釋了。
若是咱們刪除掉URL欄裏面username參數項,URL爲 http://localhost:8080/param/requestparam?user_age=12&score=45.6
頁面沒法正常跳轉,報錯以下
那若是實際中,咱們確實有前端可傳可不傳的參數時,怎麼辦?@RequestParam註解給了一個required屬性,標註該參數項是否必須有,其默認值爲true,即必須傳值;若該值可能爲空,則將required置爲false。注意,此時,@RequestParam後面的數據類型必須爲包裝類型,不能夠是簡單類型,若爲簡單類型,依然會報錯。包裝類型時,能夠接收null對象;若爲簡單類型,則系統依然會將空字符串與對應的簡單類型進行強轉,轉換失敗的,則拋異常出來。
咱們將上面方法參數作部分修改,修改以下,因爲篇幅關係,這裏再也不總體貼整個方法
@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對應的類型修改成Integer包裝類型,required設置爲false;score,只是設置required設置爲false
啓動springboot作測試,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=89
這裏咱們將user_age後面的參數值設置爲空,請求能夠正常跳轉
咱們再修改一下URL參數項,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=
系統會報400錯誤,提示score是空字符串,若是將數據類型double修改成Double,就會返回null了,這個這裏就不測試了
接收前端傳遞的數組
springMVC中,前端日後端除了能夠傳遞一些單值外,也能夠傳遞數組。傳遞數據部分沒有太多規則可言,在後臺控制器部分,定義數組形式接收數據,前端傳遞時,將一組數據用英文的逗號「,」隔開就能夠了。
@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」、「lisi」和「wangwu」之間用「,」隔開
頁面能夠正常跳轉
經過URL傳遞參數
這裏經過URL傳遞參數與上面的URL不一樣,上面的URL中均需寫明參數名和對應參數值,這裏的URL傳遞參數,僅須要在地址欄輸入參數值,而後後臺自動匹配到對應的參數名。springMVC經過使用處理器映射和@PathVariable註解的組合來獲取URL參數。首先經過處理器映射能夠定位參數的位置和名稱,而@PathVariable則能夠經過名稱來獲取參數。
/**
* 使用URL傳參
* URL傳參時,方法請求URL後使用{}包含參數名稱,多個參數之間使用/分隔
* @param name 姓名
* @param age 年齡
* @param score 成績
* @return 響應的json數據
*/
@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
正常跳轉
若是中間某個參數可能爲空呢,查了下@PathVariable註解有required屬性,可是經測試,發現這個屬性沒法單獨使用。
若是中間某個參數爲空,還得借用@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參數,這裏,視有無age的請求爲不一樣的請求
使用URL http://localhost:8080/param/geturl/zhangsan//89 作測試,能夠正常跳轉