Spring MVC 地址請求映射
1. 前言
本節(jié)課將和大家一起講解 Spring MVC 的地址請求映射方案。通過本節(jié)課程的學(xué)習(xí),你將了解到:
- 如何使用注解的方式進行映射;
- 如何對請求的 URL 進行篩選、過濾。
本章節(jié)內(nèi)容相對而言較易理解,請掌握本章節(jié)中所提及的注解的使用。
2. @RequestMapping
什么是地址請求映射?
Spring MVC WEB 項目中,每一次請求都會交給用戶控制器響應(yīng)。為了保證用戶能請求到用戶控制器,則需要 Spring MVC 向外提供用戶控制器對外的請求接口。這就是請求地址映射。
如何映射?
答案是:可以使用 @RequestMapping 注解。
@RequestMapping 注解的作用:把用戶控制器以 URL 邏輯名的方式向外映射,用于由外向內(nèi)的請求調(diào)用。
Tips: 向外提供映射是 @RequestMapping 注解的事情。解析請求包中的信息,查找是否存在相匹配的控制器,這個工作由映射器組件完成。
2.1 @RequestMapping 的位置
@RequestMapping 注解既可以放置在類前面也可以放在方法前面。
@Controller
//類名前面
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/register")
public String register() {
return “user/register”;
}
}
如上代碼,請求控制器中的 register() 方法的 URL 應(yīng)該是 http://localhost:8888/user/register 。 如果類前面沒 @RequestMapping 則訪問的 URL 應(yīng)該是 http://localhost:8888/register 。
如此可知,通過類前面添加 @RequestMapping 注解可以歸類控制器的主體功能,窄化請求范圍。
Tips: 可以把類前面 @RequestMapping 中提供的名字看成命名空間。
2.2 使用表達式限定請求
@RequestMapping 注解的映射描述具有多樣性:
- 支持標準的 URL 格式;
- 支持 Ant 風(fēng)格。
什么是 Ant 風(fēng)格?
所謂 Ant 風(fēng)格指在 URL 中支持 通配符的語法結(jié)構(gòu)描述。 Ant 的通配符主要是 3 種:
- ?: 匹配任何單字符;
- * : 匹配 0 個或者任意數(shù)量的字符;
- ** : 匹配 0 個或者更多的目錄。
如下面的地址請求映射:
-
/user/*/saveUser:可匹配類似于 /user/aaa/saveUser、/user/bbb/saveUser 等請求 URL;
-
/user/**/saveUser:可以匹配 /user/saveUser、/user/aaa/bbb/saveUser 等請求 URL;
Tips : ** 可以表示多個目錄。
- /user/saveUser??:匹配 /user/saveUseraa、/user/saveUserbb 等請求 URL;
Spring MVC 的地址請求映射除了支持通配符外,還支持帶 {xxx} 占位符的 URL。
如下面的地址請求映射:
- /user/{userId}:可以匹配 user/1、user/2、user/123 等請求 URL;
- /user/**/{userId}:可以匹配 user/aa/bbb/1、user/aaa/45 等請求 URL;
- company/{companyId}/user/{userId}/detail:可以匹配 company/1/user/2/detail 等請求 URL。
2.3 限定請求的方法
先看一看 @RequestMapping 注解中提供的相關(guān)方法:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] consumes() default {};
String[] produces() default {};
}
其中有 2 個很實用的方法:
- method():可限定請求的方法;
- params():可以限定請求的參數(shù)。
先了解一下如何限定請求方法。
所謂限定請求方法,指用戶控制器中的某些方法只響應(yīng)特定的請求方法。
在 HTTP 協(xié)議中請求方法有多種,常用的請求方法如下:
- GET: 一般用于查詢請求,具有冪等性,多次相同的請求會返回相同的結(jié)果,所以可以使用瀏覽器緩存。不會影響系統(tǒng)的整體性能;
- POST: 一般用于數(shù)據(jù)保存請求。不具有冪等性,多次操作會產(chǎn)生新的資源;
- DELETE: 一般用于刪除資源請求,可以多次刪除;
- PUT: 一般用于更新數(shù)據(jù)請求,也具有冪等性,無論更新多次性,結(jié)果都一樣。
如下面的實例,test() 方法只能響應(yīng)以 POST 方式發(fā)出的請求:
@RequestMapping
@RequestMapping(value="/test",method=RequestMethod.POST)
public String test(){
return "user/test1";
}
RequestMethod 是一個枚舉類型:
public enum RequestMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}
你可以根據(jù)自己的需要為控制器中的方法設(shè)定響應(yīng)不同的請求方式。
2.4 限定請求參數(shù)
限定請求參數(shù)和限定請求方法同工異曲。所謂限定請求參數(shù),Spring MVC 會檢查請求包中是否包含符合要求的請求參數(shù)。通過 @RequestMapping 注解中的 params() 方法實現(xiàn)參數(shù)篩選。
如下面的實例:
@RequestMapping(value="/test", params="userId")
public String test(){
...
}
test()方法只會響應(yīng)請求包中包含有 userId 參數(shù)的 URL。
params()方法支持條件運算符構(gòu)建的表達式。
- params=“userId”: 指揮響應(yīng)請求包中包含有名為 userId 參數(shù)的請求;
- params="!userId" : 如果請求包中有名為 userId 的請求參數(shù),則不響應(yīng),否則響應(yīng);
- params=“userId!=1”: 對響應(yīng)的請求有更多的要求,除了請求包中必須包含 userId 參數(shù)外,其值必須是 1;
- params={“userId=1”,“userName”}: 響應(yīng)的條件是,請求包中必須包含名為 userId 和 userName 這兩個參數(shù),且 userId 參數(shù)的值必須為 1。
Tips : 方法、參數(shù)限制可同時使用。
@RequestMapping(value="/test",method = RequestMethod.POST,params = {"userId"}) public String test() { return null; }
2.5 限定頭信息
所謂限定頭信息,指 Spring MVC 可以通過 HTTP 請求包中的消息頭信息進行過濾。如下面的實例:
@RequestMapping(value="/test",headers="content-type=text/*")
public String test(){
...
}
test() 方法只會響應(yīng)請求包中的內(nèi)容類型為 text/* 的請求。
無論是方法限定、還是參數(shù)限定或是頭信息限定,其本質(zhì)都是檢查請求包是否符合條件要求。
3. 小結(jié)
本節(jié)課和大家一起講解了 Spring MVC 的地址請求映射,認識了 @RequestMapping 注解。此注解最主要的功能就是使用一個邏輯名把內(nèi)部控制器或控制器中的方法暴露給使用者。
@RequestMapping 提供了很靈活的映射方案,也提供了相應(yīng)的內(nèi)部方法對請求 URL 進一步過濾、篩選。
記住這個注解的使用,你便能變著花樣把控制器映射出去。