SpringMVC之請求參數的獲取方式
轉載出處:https://www.toutiao.com/i6510822190219264516/
SpringMVC之請求參數的獲取方式
常見的一個web服務,如何獲取請求參數?
一般最常見的請求為GET和POST,get請求的參數在url上可以獲取,post請求參數除了url上還有可能在表單中,文件上傳時,獲取方式又和一般的參數獲取不一樣
本篇則主要集中在不同請求方式下,獲取參數的使用姿勢
首先需要搭建一個後端的請求,為了快速演示
利用spring-boot創建了一個機器簡單的工程,依賴版本1.5.4.RELEASE
I. GET請求參數獲取
get請求參數,一般都是直接掛在請求的url上,所以獲取這些參數還是比較簡單的
1. 通過 HttpServletRequest獲取參數
這個可以說是最基本最常見的的方式了,javax.servlet.ServletRequest#getParameter來獲取對應的參數,下面各處一個實例
根據上面暴露的接口,我們測試的case就很簡單了
說明
-
這是一個最基本的獲取參數的方式,get,post請求都適用的,通常在filter,intercepter中也是可以通過HttpServletRequest對象來獲取請求參數
-
除了獲取常見的請求參數之外,HttpServletRequest可以獲取請求頭的完整信息
-
在一次請求的生命周期內,可以通過下面的方式獲取Request對象(當然也可以獲取response對象)
2. 直接方法參數獲取
直接給出case, 這個方法依然是放在上面的DemoController下面的
請求驗證
註意:
-
上面這種使用方式,相當於直接將url參數映射到了Controller方法的參數上了
-
方法參數名必須和url參數名完全一致(區分大小寫)
-
順序無關
-
若參數沒傳,則默認為null
一個疑問
上面的demo中Controller的方法參數都是String還好,如果將password改成int,會出現什麽情況
代碼稍作修改
實際測試
結果說明
-
如果請求參數與方法參數類型不一致,會拋出轉換異常
-
如果方法參數為非封裝基本類型,則url參數必須存在,否則報錯
3. RequestParam註解方式獲取請求參數
通過@RequestParam註解獲取參數的方式和上面的一種比較類似,case如下
測試case
說明
-
不指定註解的name或value屬性時,等同於第二種使用姿勢
-
註解的name屬性或value屬性,用實際的參數名來指定
-
controller的參數名與url參數名沒有強關聯(區別第二種方式)
-
參數類型需要保證一致(通第二種方式)
-
如果url參數可選,請設置require屬性為false,如下
@RequestParam(name = "user", required = false) String username
4. Bean方式獲取參數
對於請求參數比較復雜的情況下,我比較喜歡這種使用姿勢,管理起來方便簡單
測試case
說明
-
定義一個bean,內部屬性和請求參數對應
-
允許參數不存在的情況,會使用null代替(所以,盡量不要使用非封裝基本類型,否則參數不傳時,會拋異常)
-
bean的屬性,可以根據實際情況指定類型
5. ModelAttribute註解方式
@ModelAttribute註解的方法,會優於Controller之前執行,一般更常見於向視圖傳輸數據使用,此處不詳細展開,正常來講,專門的獲取參數不太會用這這種方式來玩
6. Path參數
Path參數,專指的是請求路徑的參數,如
上面這個url中,password是我們傳統意義上的請求參數,其中path參數則是指其中req4,demo這種path路徑中的一環;對此,最常見的一個case就是常見的博客中,如開源中國的一個博客鏈接
-
566591 : 這個參數主要用來區分用戶
-
1601400 : 這個參數則主要是表示對應的博文
一般path參數的獲取方式如下
測試case
註意:
-
path參數的使用,需要確保參數存在且類型匹配
-
path參數和url參數不會相互影響
II. POST請求參數獲取
POST請求參數,更多的是看提交表單參數是否可以獲取到,以及如何獲取,主要的手段依然是上面幾種方式,下面驗證下是否ok
1. HttpServletRequest方式獲取參數
測試case,可以借助curl來實現post請求
curl也可以換成js請求測試方式
說明
-
對於HttpServletReuqest方式獲取參數時,get和post沒什麽區別
-
若url參數和表單參數同名了,測試結果顯示使用的是url參數(待確認,當然最好不要這麽幹)
2. 方法參數獲取
幾個測試demo如下
基本上使用姿勢和get沒什麽區別
3. RequestParam註解方式
註意
-
和前面的兩種方式不同的是,當post表單的參數和url參數同名時,會合並成一個字符串
4. Bean方式
這種方式不區分get,post,所以完全復雜的交互接口,完全可以考慮用bean的方式來定義請求參數
5. PathVariable
這個沒法玩...
III. 多媒體上傳參數獲取
上傳文件的支持,對於傳統的spring-mvc來說,可能需要一些添加一些相關配置,不在本文的範疇內,下面默認已經配置好
實例支持
簡單來說,主要是利用HttpServletRequest來獲取上傳的文件
註意:
-
如果接口必須要求上傳文件,可以直接把參數聲明為MultipartHttpServletRequest, 此時調用方如果不傳參數,會被異常攔截(可以通過@ControllerAdvice來攔截全局異常)
-
如果可以不上傳文件,則可以用上面的這種猥瑣姿勢,內部進行判斷
-
((MultipartHttpServletRequest) request).getFile(xxx)來獲取指定名的上傳文件
IV. 小結
1. 五種獲取參數的姿勢
方式 | 註意事項 |
---|---|
HttpServletRequest獲取參數 | 最常見通用 |
方法參數與請求參數同名 | 註意參數名統一,註意類型一致,盡量不用非包裝基本類型 |
@RequestParam註解 | 同上,可註解內指定http參數名 |
Bean方式 | 定義一個bean,會將同名的http參數賦值進去,推薦 |
@PathVariable 註解 | 請求url參數 |
2. 傳文件使用姿勢
使用MultipartHttpServletRequest來獲取上傳的文件,當然也可以獲取基本的請求參數
V. 其他
聲明
盡信書則不如,已上內容,純屬一家之言,因本人能力一般,見解不全,如有問題,歡迎批評指正
SpringMVC之請求參數的獲取方式