目錄
1、@RequestMapping注解的作用
2、@RequestMapping注解的位置
3、value屬性
(1)基礎(chǔ)用法
(3)路徑中的占位符(重點(diǎn))
4、method屬性
5、params屬性(了解)
6、headers屬性(了解)
1、@RequestMapping注解的作用
@RequestMapping注解的作用,就是將請求和處理請求的控制器方法關(guān)聯(lián)起來
,建立映射關(guān)系。
SpringMVC接收到一個(gè)請求,就會(huì)在映射關(guān)系中找到對應(yīng)的控制器方法來處理這個(gè)請求。
@RequestMapping有很多屬性,設(shè)置得越多,匹配的請求越精確
。
控制器中有多個(gè)方法對應(yīng)同一個(gè)請求,怎么處理?
編譯前正常,運(yùn)行時(shí)報(bào)錯(cuò)。說對于這個(gè)請求,已經(jīng)存在對應(yīng)的控制器方法了
多個(gè)控制器,對于同一個(gè)請求配置了不同的控制器方法,怎么處理?
編譯前正常,運(yùn)行時(shí)報(bào)錯(cuò)。說對于這個(gè)請求,已經(jīng)存在對應(yīng)的控制器方法了
也就是說,請求和它的處理器方法必須是一一對應(yīng)的關(guān)系
。
2、@RequestMapping注解的位置
查看@RequestMapping注解的源碼
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
...
}
從@Target可以看出
- ElementType.TYPE:可以標(biāo)記類
- ElementType.METHOD:可以標(biāo)記方法
有兩種情況,標(biāo)記在類上和標(biāo)記在方法上
@RequestMapping標(biāo)識(shí)一個(gè)類:設(shè)置映射請求的請求路徑的
初始信息
@RequestMapping標(biāo)識(shí)一個(gè)方法:設(shè)置映射請求請求路徑的
具體信息
@Controller
@RequestMapping("/test")
public class RequestMappingController {
//此時(shí)請求映射所映射的請求的請求路徑為:/test/testRequestMapping
@RequestMapping("/testRequestMapping")
public String testRequestMapping(){
return "success";
}
}
使用場景
常用于
區(qū)分不同模塊的相同功能
比如用戶模塊和訂單模塊都有展示數(shù)據(jù)功能,請求路徑都是/list。
如果單純在兩個(gè)控制器中配置兩個(gè)針對/list的方法,則一個(gè)請求對應(yīng)了兩個(gè)控制方法,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
而為了功能命名的統(tǒng)一,也不希望設(shè)置不同的名稱,比如/user_list 與 /order_list ,這樣雖然可以解決問題,但不合理。
可以使用在類上配置@RequestMapping的方式,來區(qū)分用戶和訂單的 /list。
比如
@Controller
@RequestMapping("/user")
public class UserController {
//此時(shí)請求映射所映射的請求的請求路徑為:/user/list
@RequestMapping("/list")
public String getUserList(){
return "userList";
}
}
@Controller
@RequestMapping("/order")
public class OrderController {
//此時(shí)請求映射所映射的請求的請求路徑為:/order/list
@RequestMapping("/list")
public String getOrderList(){
return "orderList";
}
}
在訪問時(shí),可以指定"/user/list" 和"/order/list"
3、value屬性
(1)基礎(chǔ)用法
閱讀源碼
public @interface RequestMapping {
...
@AliasFor("path")
String[] value() default {};
...
}
@RequestMapping中value屬性的作用
value屬性必須配置!
@RequestMapping注解的value屬性
通過請求的請求地址匹配請求映射
。它是一個(gè)字符串類型的數(shù)組,表示該請求映射
能夠匹配多個(gè)請求地址
所對應(yīng)的請求
@RequestMapping(value={"/text1", "/text2"})
public String toTarget(){
System.out.println("請求收到");
//返回視圖名稱
return "text";
}
通過/text1和/text2,都能匹配到這個(gè)控制器方法,跳轉(zhuǎn)到text對應(yīng)的視圖頁面
注意文章來源:http://www.zghlxwxcb.cn/news/detail-423593.html
有些特殊字符不能被匹配,例如 ? 或 / 或 空格
(3)路徑中的占位符(重點(diǎn))
SpringMVC支持路徑中的占位符,在restful風(fēng)格中會(huì)用到
什么是restful風(fēng)格
通過拼接請求路徑的方式,傳遞請求參數(shù)
原始方式:/deleteUser?id=1
rest方式:/deleteUser/1
服務(wù)器如何知道哪個(gè)/是目錄,哪個(gè)/是參數(shù)?
參數(shù)部分,用{}占位符來填充。
例如 /test/{} 就可以匹配/test/1 ,而/test/test/1這樣的更深目錄,就不會(huì)被錯(cuò)誤匹配到
但要注意,此時(shí) /test 請求不能被 /test/{}匹配到。 /test/ 也不行。
如何使用restful風(fēng)格傳參
當(dāng)請求路徑中,將某些數(shù)據(jù)通過路徑的方式傳輸?shù)椒?wù)器中后;
就可以在相應(yīng)的@RequestMapping注解的value屬性中,通過占位符{自定義名稱}表示傳輸?shù)臄?shù)據(jù);
在控制器方法的參數(shù)部分添加
@PathVariable注解
,將占位符所表示的數(shù)據(jù)賦值給控制器方法的形參;這樣就實(shí)現(xiàn)了從前端頁面?zhèn)鲄⒔o后端控制器方法。
總結(jié):
占位符{}告訴控制方法,此處是一個(gè)rest風(fēng)格的參數(shù);
@PathVariable用于將這個(gè)參數(shù)與控制器方法的形參進(jìn)行綁定,使之可以在方法中使用。
示例
單個(gè)參數(shù)
模擬傳參
<a th:href="@{/testPath/3}">rest風(fēng)格</a>
控制器方法
@RequestMapping("/testPath/{id}")
public String testPath(@PathVariable String id){
System.out.println("id = " + id);
return "target";
}
就可以獲取到前端頁面?zhèn)鬟f的 3
多個(gè)參數(shù)
@RequestMapping("/testPath/{id}/{username}")
public String testPath(@PathVariable String id, @PathVariable String username){
System.out.println("id = " + id);
System.out.println("username = " + username);
return "target";
}
4、method屬性
閱讀源碼
public @interface RequestMapping {
...
RequestMethod[] method() default {};
...
}
可以看出,method是一個(gè)RequestMethod類型的數(shù)組(RequestMethod就是請求方法)
RequestMethod是一個(gè)枚舉類,包括:GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
@RequestMapping中method屬性的作用
@RequestMapping注解的method屬性
通過請求的請求方式(get或post)匹配請求映射
。它是一個(gè)RequestMethod類型的數(shù)組,表示該請求映射
能夠匹配多種請求方式
的請求如果不設(shè)置method,
默認(rèn)是任何請求方式都能匹配
(因?yàn)榇藭r(shí)不以請求方式為條件)
使用場景
后續(xù)CRUD時(shí),可以根據(jù)請求方式的不同,在同一個(gè)請求路徑下,匹配不同的控制方法,執(zhí)行不同的SQL語句。
示例
由于value屬性必須設(shè)置,所以設(shè)置method屬性后,意思是既要滿足請求地址,又要滿足請求方法
。
@RequestMapping(value="/target", method = {RequestMethod.GET, RequestMethod.POST})
public String toTarget(){
System.out.println("請求收到");
//返回視圖名稱
return "target";
}
注意
如果當(dāng)前請求的請求地址滿足請求映射的value屬性,但是請求方式不滿足method屬性,則瀏覽器報(bào)錯(cuò)405:Request Method 'POST' not supported,請求方式不被支持。
派生注解
1、對于處理指定請求方式的控制器方法,SpringMVC中提供了@RequestMapping的派生注解:
- 處理get請求的映射 --> @GetMapping
- 處理post請求的映射 --> @PostMapping
- 處理put請求的映射 --> @PutMapping
- 處理delete請求的映射 --> @DeleteMapping
派生注解的作用
使用這些派生注解,就不用去指定請求方法了。
例如@GetMapping("/test")相當(dāng)于@RequestMapping(value="/test", method=RequestMethod.GET)
示例
@GetMapping("/get")
public String getMapping(){
return "get";
}
意思是,匹配 請求名稱為get,請求方法為get的請求。
2、常用的請求方式有g(shù)et、post、put、delete
- get:查詢
- post:修改
- put:增加
- delete:刪除
但目前瀏覽器只支持get和post,如何發(fā)送其他類型的請求?
若在form表單提交時(shí),為method設(shè)置了其他請求方式的字符串(put或delete),則會(huì)按照默認(rèn)的請求方式get處理。
若要發(fā)送put和delete請求,需要通過Spring提供的過濾器HiddenHttpMethodFilter。是restful的內(nèi)容
5、params屬性(了解)
閱讀源碼
String[] params() default {};
params是一個(gè)字符串類型的數(shù)組
params屬性的作用
@RequestMapping注解的params屬性
通過請求的請求參數(shù) 匹配請求映射
它是一個(gè)字符串類型的數(shù)組,可以通過四種
表達(dá)式
設(shè)置請求參數(shù)和請求映射的匹配關(guān)系:
"param":要求請求映射所匹配的請求必須攜帶param請求參數(shù)
"!param":要求請求映射所匹配的請求必須不能攜帶param請求參數(shù)
"param=value":要求請求映射所匹配的請求必須攜帶param請求參數(shù)且param=value
"param!=value":要求請求映射所匹配的請求必須攜帶param請求參數(shù)但是param!=value
如果設(shè)置了多個(gè)參數(shù)匹配,則
必須同時(shí)滿足
,請求才能映射到。
示例
@RequestMapping(
value = "/test"
,params = {"username","password!=123456"}
)
public String testRequestMapping(){
return "success";
}
意思是匹配 請求名稱為test,請求參數(shù)包括username,且請求參數(shù)中password不等于123456的請求
注意
若當(dāng)前請求滿足@RequestMapping注解的value和method屬性,但是不滿足params屬性,此時(shí)頁面會(huì)報(bào)錯(cuò)400:Parameter conditions "username, password!=123456" not met for actual request parameters: username={admin}, password={123456}
6、headers屬性(了解)
閱讀源碼
String[] headers() default {};
headers屬性的作用
@RequestMapping注解的headers屬性
通過請求的請求頭信息匹配請求映射
性是一個(gè)字符串類型的數(shù)組,可以通過四種表達(dá)式設(shè)置請求頭信息和請求映射的匹配關(guān)系
"header":要求請求映射所匹配的請求必須攜帶header請求頭信息
"!header":要求請求映射所匹配的請求必須不能攜帶header請求頭信息
"header=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header=value
"header!=value":要求請求映射所匹配的請求必須攜帶header請求頭信息且header!=value
注意
若當(dāng)前請求滿足@RequestMapping注解的value和method屬性,但是不滿足headers屬性,此時(shí)頁面 顯示404錯(cuò)誤,即資源未找到文章來源地址http://www.zghlxwxcb.cn/news/detail-423593.html
到了這里,關(guān)于Spring MVC-@RequestMapping注解詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!