溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用springboot獲取控制器參數(shù)

發(fā)布時間:2021-12-17 16:06:52 來源:億速云 閱讀:269 作者:小新 欄目:開發(fā)技術

小編給大家分享一下怎么使用springboot獲取控制器參數(shù),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

如題,這里介紹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 響應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;
	}

方法中,我們接收三個參數(shù),分別為name,age和score

啟動springboot后,在瀏覽器中請求URL:http://localhost:8080/param/noannotation?name=zhangsan&age=14&score=89.1

前端頁面會自動得到我們輸入的參數(shù)的json形式

怎么使用springboot獲取控制器參數(shù)

如果我們的請求URL中name不給參數(shù)值 http://localhost:8080/param/noannotation?name=&age=12&score=89.1

請求可以正常跳轉

怎么使用springboot獲取控制器參數(shù)

如果我們將int 或 long 參數(shù)為空,給URL http://localhost:8080/param/noannotation?name=lisi&age=12&score=

請求會報錯

怎么使用springboot獲取控制器參數(shù)

無法將String型參數(shù)轉化為需要的double型。

這里可以看出,如果我們不給參數(shù)賦值,那么spring會將空著的參數(shù)默認按照String型空字符串處理。所以,如果是String型的參數(shù),為空時不報錯的;若是非String型參數(shù),則必須非空。

使用@RequestParam獲取參數(shù)

上面的無注解情況下,HTTP參數(shù)與控制器參數(shù)名稱必須一致。若HTTP參數(shù)與控制器參數(shù)不一致時,我們就需要將前端參數(shù)與后端參數(shù)對應起來,這里我們使用@RequestParam來確定前后端參數(shù)名稱的映射關系。

	/**
	 * 使用@RequestParam獲取參數(shù)
	 * 這里RequestParam注解會將括號里面的前端參數(shù)名稱轉化為后面的參數(shù)名稱
	 * @param name String 姓名,接收前端username參數(shù)
	 * @param age int 年齡,接收前端user_age參數(shù)
	 * @param score double 分數(shù),接收前端score參數(shù)
	 * @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

可以正常跳轉,并將結果展示在前端

怎么使用springboot獲取控制器參數(shù)

如果將URL中username后面值置空,頁面可以正常跳轉,測試URL

http://localhost:8080/param/requestparam?username=&user_age=12&score=45.6

怎么使用springboot獲取控制器參數(shù)

若我們將user_age 或 score值置空,則頁面會報錯

怎么使用springboot獲取控制器參數(shù)

與上面無注解時錯誤相同,這里不做解釋了。

如果我們刪除掉URL欄里面username參數(shù)項,URL為 http://localhost:8080/param/requestparam?user_age=12&score=45.6

頁面無法正常跳轉,報錯如下

怎么使用springboot獲取控制器參數(shù)

那如果實際中,我們確實有前端可傳可不傳的參數(shù)時,怎么辦?@RequestParam注解給了一個required屬性,標注該參數(shù)項是否必須有,其默認值為true,即必須傳值;若該值可能為空,則將required置為false。注意,此時,@RequestParam后面的數(shù)據(jù)類型必須為包裝類型,不可以是簡單類型,若為簡單類型,依然會報錯。包裝類型時,可以接收null對象;若為簡單類型,則系統(tǒng)依然會將空字符串與對應的簡單類型進行強轉,轉換失敗的,則拋異常出來。

我們將上面方法參數(shù)做部分修改,修改如下,由于篇幅關系,這里不再整體貼整個方法

	@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后面的參數(shù)值設置為空,請求可以正常跳轉

怎么使用springboot獲取控制器參數(shù)

我們再修改一下URL參數(shù)項,http://localhost:8080/param/requestparam?username=zhangsan&user_age=&score=

系統(tǒng)會報400錯誤,提示score是空字符串,如果將數(shù)據(jù)類型double修改為Double,就會返回null了,這個這里就不測試了

怎么使用springboot獲取控制器參數(shù)

接收前端傳遞的數(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”之間用“,”隔開

頁面可以正常跳轉

怎么使用springboot獲取控制器參數(shù)

通過URL傳遞參數(shù)

這里通過URL傳遞參數(shù)與上面的URL不同,上面的URL中均需寫明參數(shù)名和對應參數(shù)值,這里的URL傳遞參數(shù),僅需要在地址欄輸入?yún)?shù)值,然后后臺自動匹配到對應的參數(shù)名。springMVC通過使用處理器映射和@PathVariable注解的組合來獲取URL參數(shù)。首先通過處理器映射可以定位參數(shù)的位置和名稱,而@PathVariable則可以通過名稱來獲取參數(shù)。

	/**
	 * 使用URL傳參
	 * URL傳參時,方法請求URL后使用{}包含參數(shù)名稱,多個參數(shù)之間使用/分隔
	 * @param name 姓名
	 * @param age 年齡
	 * @param score 成績
	 * @return 響應的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

正常跳轉

怎么使用springboot獲取控制器參數(shù)

如果中間某個參數(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 做測試,可以正常跳轉

怎么使用springboot獲取控制器參數(shù)

以上是“怎么使用springboot獲取控制器參數(shù)”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI