請(qǐng)求處理-SpringBoot常用參數(shù)注解使用
注解:
@PathVariable 路徑變量
@RequestHeader 獲取請(qǐng)求頭
@RequestParam 獲取請(qǐng)求參數(shù)(指問號(hào)后的參數(shù),url?a=1&b=2)
@CookieValue 獲取Cookie值
@RequestAttribute 獲取request域?qū)傩?/p>
@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ì)包含路徑中所有的變量與值。
訪問:瀏覽器輸入路徑變量即可,以下是rest風(fēng)格的get請(qǐng)求的展示,直接在地址欄發(fā)起請(qǐng)求就是一個(gè)get請(qǐng)求
獲取所有訪問路徑上的請(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")publicMap getUser3(@RequestHeader("Accept")StringAccept,@RequestHeaderMap header){? ? Map map=newHashMap<>();? ? map.put("Accept",Accept);? ? map.put("header",header);returnmap;}復(fù)制代碼
測(cè)試:

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

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

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

5、@RequestAttribute注解
主要用在請(qǐng)求轉(zhuǎn)發(fā)時(shí),如果頁面無法直接跳轉(zhuǎn)(如WEB-INF下的success頁面)可以使用轉(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ù)與值獲取全部獲取出來。即獲取請(qǐng)求體【所以請(qǐng)求必須是post請(qǐng)求--@PostMapping】,一般情況下都會(huì)使用@RequestBody注解將參數(shù)映射到pojo類的能力,但是要保證前后傳入的參數(shù)名是一樣的

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

上述是最常見的三種請(qǐng)求方式;而矩陣變量請(qǐng)求是今天的主角一種新的請(qǐng)求風(fēng)格,嚴(yán)格來說矩陣變量的請(qǐng)求需要用到rest風(fēng)格但是又不同于rest.
面試官:頁面開發(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è)訪問路徑/abc。我們可以用矩陣變量的形式攜帶jsessionid值:/abc;jsessionid=xxx。上面的過程就是url重寫的過程,相當(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)求的矩陣變量中沒有給定該參數(shù)的值可以使用默認(rèn)值替代。
7.3、使用細(xì)節(jié)
由于SpringBoot中默認(rèn)并沒有開啟矩陣變量的支持,直接關(guān)閉了矩陣變量。因此在使用的時(shí)候我們需要對(duì)SpringBoot自動(dòng)裝配的Bean對(duì)象進(jìn)行手動(dòng)的配置更改。
7.3.1、WebMvcAutoConfiguration自動(dòng)裝配

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

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

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

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ù)的幾種常用方式
摘自:blog.csdn.net/qq_20957669…
現(xiàn)在大多數(shù)互聯(lián)網(wǎng)項(xiàng)目都是采用前后端分離的方式開發(fā),前端人員負(fù)責(zé)頁面展示和數(shù)據(jù)獲取,后端負(fù)責(zé)業(yè)務(wù)邏輯處理和接口封裝。當(dāng)與前端交互的過程當(dāng)中,常用json數(shù)據(jù)與前端進(jìn)行交互,這樣想取出前端傳送過來的json數(shù)據(jù)的時(shí)候,就需要用到@RequestBody這個(gè)注解。@RequestBody注解用于讀取http請(qǐng)求的內(nèi)容(字符串),通過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:一般我們使用該注解來獲取多個(gè)參數(shù),在()內(nèi)寫入需要獲取參數(shù)的參數(shù)名即可,一般在PUT,POST中比較常用。
@RequestBody:該注解和@RequestParam殊途同歸,我們使用該注解將所有參數(shù)轉(zhuǎn)換,在代碼部分在一個(gè)個(gè)取出來,也是目前我使用到最多的注解來獲取參數(shù)
還有@RequestHeader來獲取頭信息里的值,@CookieValue來獲取Cookie值等等。在這,我也僅僅說明一些較常用的取值方法而已。