Spring?Boot請(qǐng)求處理之常用參數(shù)注解使用教程
請(qǐng)求處理-SpringBoot常用參數(shù)注解使用
注解:
- @PathVariable 路徑變量
- @RequestHeader 獲取請(qǐng)求頭
- @RequestParam 獲取請(qǐng)求參數(shù)(指問(wèn)號(hào)后的參數(shù),
url?a=1&b=2) - @CookieValue 獲取Cookie值
- @RequestAttribute 獲取request域?qū)傩?/li>
- @RequestBody 獲取請(qǐng)求體[POST]
- @MatrixVariable 矩陣變量
- @ModelAttribute
1、@PathVariable注解
該注解主要是用于rest風(fēng)格的搭配使用,在請(qǐng)求路徑中不再以k : v的形式給出請(qǐng)求參數(shù)與值;而是直接給定一個(gè)值。如果方法參數(shù)是一個(gè)Map<String, String>將會(huì)包含路徑中所有的變量與值。
訪問(wèn):瀏覽器輸入路徑變量即可,以下是rest風(fēng)格的get請(qǐng)求的展示,直接在地址欄發(fā)起請(qǐng)求就是一個(gè)get請(qǐng)求
獲取所有訪問(wèn)路徑上的請(qǐng)求參數(shù):localhost:8080/ car/{id}/owner/{username}?age=19&inters=

2、@RequestHeader注解
該注解主要用于獲取請(qǐng)求頭header中的數(shù)據(jù),客戶端請(qǐng)求之后可以拿到一些頭部攜帶的參數(shù)。支持傳統(tǒng)的SpringMVC,也支持WebFlux響應(yīng)式。如果方法參數(shù)是一個(gè)Map<String, String>將會(huì)包含所有的請(qǐng)求頭與值
@GetMapping("user/RequestHeader")
public Map<String,Object> getUser3(@RequestHeader("Accept") String Accept,
@RequestHeader Map<String,String> header){
Map<String,Object> map=new HashMap<>();
map.put("Accept",Accept);
map.put("header",header);
return map;
}測(cè)試:

3、@RequestParam注解
主要用于獲取請(qǐng)求參數(shù)名稱,設(shè)置參數(shù)是否可有可無(wú)以及默認(rèn)值。

@RequestParam注解詳解地址:blog.csdn.net/weixin_4380…

4、@CookieValue注解
主要用于獲取Cookie值

5、@RequestAttribute注解
主要用在請(qǐng)求轉(zhuǎn)發(fā)時(shí),如果頁(yè)面無(wú)法直接跳轉(zhuǎn)(如WEB-INF下的success頁(yè)面)可以使用轉(zhuǎn)發(fā)的手段。當(dāng)進(jìn)行轉(zhuǎn)發(fā)時(shí)可以在請(qǐng)求中攜帶上請(qǐng)求的參數(shù),轉(zhuǎn)發(fā)會(huì)攜帶上一次請(qǐng)求的參數(shù)(一次完整的請(qǐng)求包括轉(zhuǎn)發(fā))
由于是同一次請(qǐng)求,因此也可以直接拿到原生的HttpServletRequest,然后從這里面拿參數(shù)和屬性也都是可以的【獲取request域?qū)傩浴俊?/p>
下面就體現(xiàn)了一種轉(zhuǎn)發(fā)的思想

結(jié)果

6、@RequestBody注解
主要獲取表單或者ajax提交的內(nèi)容,將表單中提交的參數(shù)與值獲取全部獲取出來(lái)。即獲取請(qǐng)求體【所以請(qǐng)求必須是post請(qǐng)求--@PostMapping】,一般情況下都會(huì)使用@RequestBody注解將參數(shù)映射到pojo類(lèi)的能力,但是要保證前后傳入的參數(shù)名是一樣的

7、@MatrixVariable與UrlPathHelper
7.1、基本簡(jiǎn)介

上述是最常見(jiàn)的三種請(qǐng)求方式;而矩陣變量請(qǐng)求是今天的主角一種新的請(qǐng)求風(fēng)格,嚴(yán)格來(lái)說(shuō)矩陣變量的請(qǐng)求需要用到rest風(fēng)格但是又不同于rest.
面試官:頁(yè)面開(kāi)發(fā)當(dāng)中把cookie禁用了,session里面的內(nèi)容怎么使用(找到)???
- 正常使用cookie的情況:session.set(a,b)→jsessionid→cookie→每次發(fā)請(qǐng)求攜帶該值
- 每一個(gè)用戶都有一個(gè)不同的sessionid,我們稱之為jsessionid,jsessionid會(huì)被保存在cookie里面,我們用戶在發(fā)送請(qǐng)求的時(shí)候都會(huì)攜帶cookie。因此禁用了cookie就不能獲取里面保存的對(duì)象。
- 解決禁用cookie的情況:假設(shè)訪問(wèn)路徑/abc。我們可以用矩陣變量的形式攜帶
jsessionid值:/abc;jsessionid=xxx。上面的過(guò)程就是url重寫(xiě)的過(guò)程,相當(dāng)于把cookie的值使用矩陣變量的方式進(jìn)行傳遞。
7.2、MatrixVariable注解

由上面源碼知道首先可以知道這個(gè)注解是一個(gè)修飾在參數(shù)上的注解,并且可以在運(yùn)行時(shí)被JVM虛擬機(jī)加載到。
- value 和 name屬性是兩個(gè)相同的屬性,用于綁定獲取到請(qǐng)求的參數(shù)。
- pathvar是一個(gè)比較重要的屬性,當(dāng)多級(jí)路徑中出現(xiàn)了相同的參數(shù)可以用pathvar指定綁定哪一級(jí)路徑,然后在獲取該級(jí)下的參數(shù)。
- required屬性主要是修飾當(dāng)前這個(gè)矩陣變量是否是必須的;true表示必須,false表示非必須。
- defaultValue屬性當(dāng)required屬性值為false時(shí),提交請(qǐng)求的矩陣變量中沒(méi)有給定該參數(shù)的值可以使用默認(rèn)值替代。
7.3、使用細(xì)節(jié)
由于SpringBoot中默認(rèn)并沒(méi)有開(kāi)啟矩陣變量的支持,直接關(guān)閉了矩陣變量。因此在使用的時(shí)候我們需要對(duì)SpringBoot自動(dòng)裝配的Bean對(duì)象進(jìn)行手動(dòng)的配置更改。
7.3.1、WebMvcAutoConfiguration自動(dòng)裝配

- WebMvcAutoConfiguration自動(dòng)裝配類(lèi)由SpringBoot啟動(dòng)時(shí)自動(dòng)裝配;
- 內(nèi)部類(lèi)WebMvcAutoConfigurationAdapter適配器實(shí)現(xiàn)了WebMvcConfigurer接口中的所有方法。
- WebMvcConfigurer接口中的所有方法都是有默認(rèn)實(shí)現(xiàn)的,JDK8的新特性。
7.3.2、UrlPathHelper類(lèi)

真正使得無(wú)法使用矩陣變量的原因是UrlPathHelper類(lèi)中的removeSemicolonContent默認(rèn)為true,即移除分號(hào)內(nèi)容。
- 由于MatrixVariable矩陣變量是根據(jù)分號(hào)進(jìn)行區(qū)分的,而底層默認(rèn)是移除的也就是說(shuō)不生效。
- 因此手動(dòng)開(kāi)啟原理:對(duì)于路徑的處理,SpringBoot用UrlPathHelper進(jìn)行解析,其里面的屬性removeSemicolonContent設(shè)置為false,才能讓其支持矩陣變量。
7.3.3、手動(dòng)配置矩陣變量

方法:參照第一章說(shuō)的SpringBoot三個(gè)自配置規(guī)則,利@configuration+WebMvcConfigurer自定義規(guī)則即可,因此為了開(kāi)啟矩陣變量的使用必須實(shí)現(xiàn)WebMvcConfigurer接口,完成對(duì)configurePathMatch方法的手動(dòng)實(shí)現(xiàn)。而WebMvcConfigurer接口中所有的方法都是default的默認(rèn)方法,因此可以使用適配器模式單獨(dú)對(duì)該方法進(jìn)行重寫(xiě)。所以可以在配置類(lèi)中手動(dòng)向IOC容器中配置一個(gè)Bean對(duì)象,該對(duì)象只對(duì)這一個(gè)方法進(jìn)行重寫(xiě)實(shí)現(xiàn)即可。
重寫(xiě)如下

7.4、測(cè)試使用
首先必須手動(dòng)配置對(duì)矩陣變量的支持,其次矩陣變量是綁定在rest路徑變量中的
7.4.1、測(cè)試一

上述兩種路徑都會(huì)使用同一個(gè)Controller進(jìn)行處理,path拿到的就是 / 到第一個(gè) ; 號(hào)之間的路徑。

7.4.2、測(cè)試二

Gage綁定{gege}中的age參數(shù),Dage綁定{didi}中的age;這樣就能準(zhǔn)確的區(qū)分出到底獲取哪個(gè)age。

7.4.3、測(cè)試三

8、補(bǔ)充:SpringBoot實(shí)現(xiàn)前后端數(shù)據(jù)交互、json數(shù)據(jù)交互、Controller接收參數(shù)的幾種常用方式
摘自:http://chabaoo.cn/article/240671.htm
現(xiàn)在大多數(shù)互聯(lián)網(wǎng)項(xiàng)目都是采用前后端分離的方式開(kāi)發(fā),前端人員負(fù)責(zé)頁(yè)面展示和數(shù)據(jù)獲取,后端負(fù)責(zé)業(yè)務(wù)邏輯處理和接口封裝。當(dāng)與前端交互的過(guò)程當(dāng)中,常用json數(shù)據(jù)與前端進(jìn)行交互,這樣想取出前端傳送過(guò)來(lái)的json數(shù)據(jù)的時(shí)候,就需要用到@RequestBody這個(gè)注解。@RequestBody注解用于讀取http請(qǐng)求的內(nèi)容(字符串),通過(guò)springmvc提供的HttpMessageConverter接口將讀到的內(nèi)容轉(zhuǎn)換為json、xml等格式的數(shù)據(jù)并綁定到controller方法的參數(shù)上。
提交方式為 POST 時(shí),
JQuery Ajax 以 application/x-www-form-urlencoded 上傳 JSON對(duì)象 ,后端用 @RequestParam 或者Servlet 獲取參數(shù)。
JQuery Ajax 以 application/json 上傳 JSON字符串,后端用 @RquestBody 獲取參數(shù)。

獲取參數(shù)的幾種常用注解
@PathVariable:一般我們使用URI template樣式映射使用,即url/{param}這種形式,也就是一般我們使用的GET,DELETE,PUT方法會(huì)使用到的,我們可以獲取URL后所跟的參數(shù)。
@RequestParam:一般我們使用該注解來(lái)獲取多個(gè)參數(shù),在()內(nèi)寫(xiě)入需要獲取參數(shù)的參數(shù)名即可,一般在PUT,POST中比較常用。
@RequestBody:該注解和@RequestParam殊途同歸,我們使用該注解將所有參數(shù)轉(zhuǎn)換,在代碼部分在一個(gè)個(gè)取出來(lái),也是目前我使用到最多的注解來(lái)獲取參數(shù)
還有@RequestHeader來(lái)獲取頭信息里的值,@CookieValue來(lái)獲取Cookie值等等。在這,我也僅僅說(shuō)明一些較常用的取值方法而已。
總結(jié)
到此這篇關(guān)于Spring Boot請(qǐng)求處理之常用參數(shù)注解使用的文章就介紹到這了,更多相關(guān)Spring Boot請(qǐng)求參數(shù)注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決使用security和靜態(tài)資源被攔截的問(wèn)題
這篇文章主要介紹了解決使用security和靜態(tài)資源被攔截的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?
這篇文章主要介紹了并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?文章主要解決實(shí)戰(zhàn)中的Bug及解決方案和技術(shù)延伸,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
SpringBoot整合Mybatis Plus多數(shù)據(jù)源的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot整合Mybatis Plus多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java的MD5工具類(lèi)和客戶端測(cè)試類(lèi)
這篇文章主要介紹了Java的MD5工具類(lèi)和客戶端測(cè)試類(lèi),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-12-12
MyBatis的collection和association的使用解讀
這篇文章主要介紹了MyBatis的collection和association的使用解讀2023-12-12
springboot項(xiàng)目test文件夾下帶main方法的類(lèi)不能運(yùn)行問(wèn)題
這篇文章主要介紹了springboot項(xiàng)目test文件夾下帶main方法的類(lèi)不能運(yùn)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
maven插件spring-boot-starter-tomcat的使用方式
這篇文章主要介紹了maven插件spring-boot-starter-tomcat的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決
這篇文章主要介紹了Mybatis-Plus主鍵插入null值報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

