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