您好,登錄后才能下訂單哦!
上一篇文章搭建起來了hello world。今天主要來看看RequestMapping注解都有什么用法和功能。上一篇文章說了,RequestMapping可以用來映射URL,可以用在類上,也可以用在方法上面。
RequestMapping有以下幾個屬性:value、method、params、headers,下面簡單說一下屬性的功能
value:映射請求的url,當只定義一個url的時候,可以不寫,即以下兩種方式等價:
@RequestMapping("/testRequestMapping") @RequestMapping(value="/testRequestMapping")
value屬性還支持通配符模式:
?:匹配單個字符
*:匹配多個字符,單層路徑匹配
**:匹配多層路徑
例如:
@RequestMapping("/user/?/ef") 可以匹配:/user/a/ef、/user/s/ef、/user/y/ef、/user/3/ef @RequestMapping("/user/*/ef") 可以匹配:/user/adf/ef、/user/gggs/ef、/user/y/ef、/user/fdfdf/ef @RequestMapping("/user/**") 可以匹配:/user/abc、/user/abd、/user/abc/ef
method:定義請求的方式,一共有四種:get、post、put、delete
params:請求參數的定義,定義一次請求必須傳遞的參數和參數的值
headers:定義請求的頭部,params和headers兩個不常用
其中params和headers支持簡單的表達式
param1:表示請求必須包含名為param1的請求參數 !param1:表示請求不能包含名為param1的請求參數 param1 != value1:表示請求包含參數名為param1的請求參數,但其值不能為value1 {"param1=value1", "param2"}:表示請求必須包含參數名為param1和param2的參數, 且param1的參數值必須為value1
下面結合具體的例子來看一次requestMapping注解及其屬性定義的使用方法
1、@RequestMapping注解定義在類上,我的理解,定義在類上,類似于java中的包一樣,此時方法訪問的路徑為:類路徑/方法路徑,這里為testRequestMapping/greeting
@Controller @RequestMapping("/testRequestMapping") public class TestRequestMappingController { @RequestMapping("/greeting") public String greeting() { return "greeting"; } }
2、method屬性的使用,指定請求的方式為post,如果使用get請求的話,就會出現404
@RequestMapping(value = "/testMethod", method = RequestMethod.POST) public String testMethod() { return "greeting"; }
測試代碼,上面的鏈接會出現405的,見下圖:
<!-- 請求失敗,因為后面定義了請求類型為post --> <p>測試注解RequestMapping的method屬性,訪問失敗,因為后臺定義了請求為post方式 <a href="/testRequestMapping/testMethod">test RequestMapping method attr</a> </p> <form action="/testRequestMapping/testMethod" method="post"> <p>請求成功,因為使用form表單,定義為post請求</p> <input type="submit" value="submit" /> </form>
3、params屬性的使用,params定義了請求的參數情況,支持表達式,支持數組
/** * 使用params參數指定請求參數 * 此處示例:請求必須包含請求參數name和age,并且age的值不能為10 * /testRequestMapping/testParams?name=Jim&age=10:請求失敗 * /testRequestMapping/testParams?name=Jim&age=11:請求成功 * @return */ @RequestMapping(value = "/testParams", params = {"name", "age!=10"}) public String testParams() { return "greeting"; }
測試代碼,上面的鏈接會出現404的:
<p>測試注解RequestMapping的params屬性,后面定義必需name和age,且age不能等于10,訪問失敗 <a href="/testRequestMapping/testParams?name=Jim&age=10">test RequestMapping </a> </p> <p>測試注解RequestMapping的params屬性,后面定義必需name和age,且age不能等于10,訪問成功 <a href="/testRequestMapping/testParams?name=Jim&age=11">test RequestMapping </a> </p>
4、headers屬性,定義了請求頭相關參數,我使用的時firefox瀏覽器,查看發起請求的請求頭,以設定Accept-Language進行測試:
下面定義了兩個方法,上面的方法和瀏覽器中的一致,可以請求成功,下面的方法請求失敗
@RequestMapping(value = "/testHedersSuccess", headers = {"Accept-Language=zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3"}) public String testHedersSuccess() { return "greeting"; } @RequestMapping(value = "/testHedersFailure", headers = {"Accept-Language=zh-CN,zh;q=0.8"}) public String testHedersFailure() { return "greeting"; }
測試代碼如下,上面的出現404:
<p>測試注解RequestMapping的headers屬性,失敗 <a href="/testRequestMapping/testHedersFailure">test RequestMapping </a> </p> <p>測試注解RequestMapping的headers屬性 ,成功 <a href="/testRequestMapping/testHedersSuccess">test RequestMapping </a> </p>
5、value屬性的通配符定義,下面的示例,不能匹配多個層次,
例如不能匹配:/testWildcardPath/abc/d/ef
@RequestMapping("/testWildcardPath/*/ef") public String testWildcardPath() { return "greeting"; }
測試代碼:可以把請求路徑中的any替換為任意字符串,不能批評多個層次
<p>url通配符形式 ,可以把請求路徑中的any換成任意字符,都可以成功 <a href="/testRequestMapping/testWildcardPath/any/ef">test RequestMapping </a> </p>
6、于@PathVariable注解的配合使用,RequestMapping的value定義的url可以包含占位符,PathVariable注解就可以把url中的占位符映射到方法的參數上去
@RequestMapping("/testPathVariable/{id}") public String testPathVariable(@PathVariable("id") int id) { System.out.println(id); return "greeting"; }
測試代碼:后面的11就是參數,方法可以接收到,也可以傳遞不同的參數
<p>PathVariable測試,11就是參數,方法可以接受到這個參數 <a href="/testRequestMapping/testPathVariable/11">test RequestMapping </a> </p>
項目源代碼:
https://git.oschina.net/acesdream/spring-mvc
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。