SpringMVC中@RequestMapping注解的實(shí)現(xiàn)
0. 多個(gè)方法對(duì)應(yīng)同一個(gè)請(qǐng)求
@RequestMapping("/") public String toIndex(){ return "index"; } @RequestMapping("/") public String toIndex2(){ return "index"; }
這種情況是不允許的,會(huì)報(bào)錯(cuò)。
1. 注解的功能
@RequestMapping注解的作用就是將請(qǐng)求地址和處理請(qǐng)求的控制器方法關(guān)聯(lián)起來(lái),建立映射關(guān)系。
SpringMVC接收到指定的請(qǐng)求,就會(huì)找到映射關(guān)系中對(duì)應(yīng)的控制器方法來(lái)處理這個(gè)請(qǐng)求。
2. 注解位置
@RequestMapping注解既可以放在方法上,也可以放在類上。
標(biāo)識(shí)方法:設(shè)置映射的請(qǐng)求路徑的具體信息。
標(biāo)識(shí)類:設(shè)置映射的請(qǐng)求路徑的初始信息。
例如:如果有如下代碼
@RequestMapping("/hello") @Controller public class TestRequestMapping { @RequestMapping("/target") public String toTarget(){ return "target"; } }
那么在訪問(wèn)target之前必須加上/hello,否則訪問(wèn)不到target,也就是url為 http://localhost:8080/項(xiàng)目上下文路徑/hello/target
。
3. value屬性
- value屬性用于配置映射到控制器方法的請(qǐng)求路徑。
- value屬性是一個(gè)字符串?dāng)?shù)組,表示該控制器方法可以匹配多個(gè)請(qǐng)求地址。如果指定了多個(gè)value值,那么請(qǐng)求時(shí)滿足其中之一即可。
- value屬性必須設(shè)置。
@RequestMapping({"/test1","/test2"}) public String toTestValue(){ return "testValue"; }
<a th:href="@{/test1}" rel="external nofollow" >一個(gè)控制器方法匹配多個(gè)value測(cè)試1</a><br> <a th:href="@{/test2}" rel="external nofollow" >一個(gè)控制器方法匹配多個(gè)value測(cè)試2</a><br>
4. method屬性
- 通過(guò)請(qǐng)求方式映射控制器方法。
- method屬性是一個(gè)RequestMethod類型數(shù)組,表示該方法可以匹配多個(gè)請(qǐng)求方式。如果指定了多個(gè)method值,那么請(qǐng)求時(shí)滿足其中之一即可。
- 目前瀏覽器只能支持GET和POST方式。
- 在提交表單時(shí),如果指定了GET和POST以外的請(qǐng)求方式,則會(huì)默認(rèn)以GET請(qǐng)求發(fā)送。
- 如果請(qǐng)求地址匹配,但是請(qǐng)求方式不匹配,則會(huì)返回405,請(qǐng)求方式不允許。
- 如果不指定請(qǐng)求方式,則默認(rèn)可以處理所有請(qǐng)求方式。
- 若要發(fā)送PUT和DELETE請(qǐng)求,則需通過(guò)spring提供的過(guò)濾器HiddenHttpMethodFilter。
@RequestMapping(value="/test3",method=RequestMethod.POST) public String toTestMethod(){ return "testMethod"; }
<a th:href="@{/test3}" rel="external nofollow" >method允許POST請(qǐng)求測(cè)試</a><br> <form method="POST" th:action="@{/test3}"> username<input name="username" type="text" /><br> <input type="submit" value="提交" /><br> </form> <form method="DELETE" th:action="@{/test3}"> username<input name="username" type="text" /><br> <input type="submit" value="提交" /><br> </form>
5. params屬性
- 通過(guò)請(qǐng)求參數(shù)映射控制器方法。
- params屬性是一個(gè)字符串?dāng)?shù)組,可以通過(guò)四種表達(dá)式設(shè)置請(qǐng)求參數(shù)和控制器映射的關(guān)系。如果指定了多個(gè)請(qǐng)求參數(shù),那么在請(qǐng)求時(shí)需要全部滿足。
- “param”:要求請(qǐng)求參數(shù)必須攜帶名為param的參數(shù),參數(shù)值可以任意。
- “!param”:要求請(qǐng)求參數(shù)中不能含有名為param的參數(shù)。
- “param=value”:要求請(qǐng)求參數(shù)必須含有param且值為value。
- “param!=value”:要求請(qǐng)求參數(shù)必須含有param且值不為value。
- 如果請(qǐng)求匹配了value和method,但是沒(méi)有匹配params,會(huì)返回400狀態(tài)碼。
/*這個(gè)注解表示請(qǐng)求參數(shù)要滿足如下要求 1.要有username1,值任意 2.不能有username2 3.要有username3,且值為jack 4.要有username4,且值不能為jack 在寫(xiě)鍵值對(duì)時(shí),如果value為字符串類型,不需要使用單引號(hào)括起來(lái),否則會(huì)出錯(cuò) */ @RequestMapping(value="/test4",params={"username1","!username2","username3=jack","username4!=jack"}) public String toTestParams(){ return "testParams"; }
<!--使用?可以連接請(qǐng)求參數(shù),但是會(huì)標(biāo)紅,所以可以使用括號(hào)來(lái)表示請(qǐng)求參數(shù)--> <a th:href="@{/test4(username3='jack',username4='asd')}" rel="external nofollow" >Params沒(méi)有username1測(cè)試</a><br> <a th:href="@{/test4(username1='asd',username2='qw',username3='jack',username4='qew')}" rel="external nofollow" >Params有username2測(cè)試</a><br> <a th:href="@{/test4(username1='dg',username3='asd',username4='oih')}" rel="external nofollow" >Params有username3但值不為jack測(cè)試</a><br> <a th:href="@{/test4(username1='ih',username3='jack',username4='jack')}" rel="external nofollow" >Params有username4但值為jack測(cè)試</a><br> <a th:href="@{/test4(username1='asd',username3='jack',username4='xcv')}" rel="external nofollow" >Params參數(shù)滿足條件測(cè)試</a><br>
6. headers屬性
- 通過(guò)請(qǐng)求頭信息來(lái)匹配控制器方法。
- headers屬性是一個(gè)字符串?dāng)?shù)組,可以通過(guò)四種表達(dá)式設(shè)置請(qǐng)求頭信息和控制器的匹配關(guān)系。如果指定了多個(gè)headers值,需要全部滿足。
- “header”:要求請(qǐng)求頭中必須有header,值任意。
- “!header”:要求請(qǐng)求頭中不能含有名為header的參數(shù)。
- “header=value”:要求請(qǐng)求頭必須含有header且值為value。
- “header!=value”:要求請(qǐng)求頭必須含有header且值不為value。
- 如果請(qǐng)求滿足了value、method和params,但沒(méi)有滿足headers屬性,那么就會(huì)返回404狀態(tài)碼。
@RequestMapping(value="/test5",headers = {"Host=localhost:8080","Accept-Encoding!=gzip, deflate, br"}) public String toTestHeaders(){ return "testHeaders"; }
<a th:href="@{/test5}" rel="external nofollow" >Headers不滿足Accept-Encoding條件</a><br>
修改headers屬性后,可以使條件滿足:
@RequestMapping(value="/test5",headers = {"Host=localhost:8080","Accept-Encoding=gzip, deflate, br"}) public String toTestHeaders(){ return "testHeaders"; }
7. ant風(fēng)格的路徑
- ?:表示任意單個(gè)字符。
- *:表示任意0個(gè)或多個(gè)字符。
- **:表示任意的一層或多層目錄。注意在使用時(shí),兩個(gè)星號(hào)必須位于獨(dú)立的一層目錄內(nèi),例如
前綴路徑/**/后綴路徑
,前綴和后綴可以沒(méi)有,但是兩個(gè)星號(hào)前后或中間不能有任何內(nèi)容。
8. 路徑中的占位符
SpringMVC路徑中的占位符常用于RESTful風(fēng)格中,它允許將參數(shù)作為路徑的一部分發(fā)送給服務(wù)器,而不是以?連接在URL后。該方式傳遞的參數(shù)只能通過(guò)@PathVariable注解的value屬性中的同名變量獲得參數(shù)值。
//大括號(hào)表示占位符 @RequestMapping("/test6/{id}/{username}") public String toTest(@PathVariable("id")Integer id,@PathVariable("username")String username){ System.out.println("id = "+id+" "+"username = "+username); return "test"; }
到此這篇關(guān)于SpringMVC中@RequestMapping注解的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringMVC @RequestMapping注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringMVC中的@RequestMapping注解解析
- 詳解SpringMVC中的@RequestMapping注解
- SpringBoot中的@RequestMapping注解的用法示例
- Spring MVC-@RequestMapping注解詳解
- SpringMVC?@RequestMapping注解屬性詳細(xì)介紹
- SpringMVC @RequestMapping注解應(yīng)用方法示例講解
- 詳解SpringBoot中@PostMapping注解的用法
- SpringBoot中@GetMapping注解的使用
- SpringMVC @GetMapping注解路徑?jīng)_突問(wèn)題解決
- Spring中@RequestMapping、@PostMapping、@GetMapping的實(shí)現(xiàn)
相關(guān)文章
為了多次讀取ServletInputStream引發(fā)的一系列問(wèn)題
這篇文章主要介紹了為了多次讀取ServletInputStream引發(fā)的一系列問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10springboot項(xiàng)目打成war包部署到tomcat遇到的一些問(wèn)題
這篇文章主要介紹了springboot項(xiàng)目打成war包部署到tomcat遇到的一些問(wèn)題,需要的朋友可以參考下2017-06-06java將文件轉(zhuǎn)成流文件返回給前端詳細(xì)代碼實(shí)例
Java編程語(yǔ)言提供了強(qiáng)大的文件處理和壓縮能力,下面這篇文章主要給大家介紹了關(guān)于java將文件轉(zhuǎn)成流文件返回給前端的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07Java中IO流之字符流與字節(jié)流的轉(zhuǎn)換方式
在Java中,字節(jié)流與字符流是處理數(shù)據(jù)的兩種方式,字節(jié)流適用于處理各種數(shù)據(jù)類型,如圖片、音頻等非文本數(shù)據(jù),而字符流專門用于處理文本數(shù)據(jù),Java提供了InputStreamReader和OutputStreamWriter這兩個(gè)類來(lái)實(shí)現(xiàn)字節(jié)流向字符流的轉(zhuǎn)換2024-10-10spring @Scheduled注解的使用誤區(qū)及解決
這篇文章主要介紹了spring @Scheduled注解的使用誤區(qū)及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11springboot執(zhí)行延時(shí)任務(wù)之DelayQueue的使用詳解
DelayQueue是一個(gè)無(wú)界阻塞隊(duì)列,只有在延遲期滿時(shí),才能從中提取元素。這篇文章主要介紹了springboot執(zhí)行延時(shí)任務(wù)-DelayQueue的使用,需要的朋友可以參考下2019-12-12