1. 程式人生 > >SpringMVC之請求參數的獲取方式

SpringMVC之請求參數的獲取方式

說明 lis 依然 配置 false 不同的 來講 是否 dem

轉載出處: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之請求參數的獲取方式