@RequestMapping映射請求,@PathVariable,@RequestParam,@RequestHeader的使用
1、@RequestMapping
Spring MVC 使用 @RequestMapping 註解為控制器指定可以處理哪些 URL 請求,在控制器的類定義及方法定義處都可標註。
@RequestMapping
- 類定義處:提供初步的請求映射信息。相當於當前 WEB 應用的根目錄
- 方法處:提供進一步的細分映射信息。相對於類定義處的 URL。
- 若類定義處未標註 @RequestMapping,則方法處標記的 URL 相當於當前 WEB 應用的根目錄
- 若類定義處標註 @RequestMapping,則方法處標記的 URL 相對於類定義處的@RequestMapping而言的!
DispatcherServlet 截獲請求後,就通過控制器上@RequestMapping
映射請求參數、請求方法或請求頭
@RequestMapping 除了可以使用請求 URL 映射請求外,還可以使用請求方法、請求參數及請求頭映射請求
@RequestMapping 的 value、method、params 及 heads 分別表示請求 URL、請求方法、請求參數及請求頭的映射條件,他們之間是與的關系,聯合使用多個條件可讓請求映射更加精確化。
(1)params 和 headers支持簡單的表達式:
- param1: 表示請求必須包含名為 param1 的請求參數
- !param1: 表示請求不能包含名為 param1 的請求參數
- param1 != value1: 表示請求包含名為 param1 的請求參數,但其值 不能為 value1
- {“param1=value1”, “param2”}: 請求必須包含名為 param1 和param2 的兩個請求參數,且 param1 參數的值必須為 value1!
1 @RequestMapping(value="/helloParams",params={"username","pwd!=123456"}) 2 public String helloParams(){ 3 return "success"; 4 }
表示請求URL中必須包含username參數,pwd可不包含,若包含pwd,則值不能為123456。
(2)Ant風格的請求URL
Ant 風格資源地址支持 3 種匹配符:
- ?:匹配文件名中的一個字符
- *:匹配文件名中的任意多個任意字符[0個字符除外!]
- **:** 匹配多層路徑
例如:
- /user/*/createUser: 匹配
- /user/aaa/createUser、/user/bbb/createUser 等 URL
- /user/**/createUser: 匹配
- /user/createUser、/user/aaa/bbb/createUser 等 URL
- /user/createUser??: 匹配
- /user/createUseraa、/user/createUserbb 等 URL
(3)@PathVariable 映射 URL 綁定的占位符
帶占位符的 URL 是 Spring3.0 新增的功能,該功能在 SpringMVC 向 REST 目標挺進發展過程中具有裏程碑的意義
通過 @PathVariable 可以將 URL 中占位符參數綁定到控制器處理方法的入參中:
URL 中的 {xxx} 占位符可以通過@PathVariable("xxx") 綁定到操作方法的入參中,需要註意的是:該註解的value屬性值要與占位符保持一致。
1 @RequestMapping(value="/helloPathVariable/{id}") 2 public String helloPathVariable(@PathVariable(value="id") Integer id) throws IOException{ 3 System.out.println("id="+id); 4 return "success"; 5 }
(4)method=RequestMethod.GET/POST/PUT/DELETE,可以實現REST請求風格的URL
1 //REST請求方式-----GET獲取 2 @RequestMapping(value="/hello/{id}",method=RequestMethod.GET) 3 public String helloGet(@PathVariable(value="id") Integer id){ 4 return "success"; 5 } 6 //REST請求方式-----POST添加 7 @RequestMapping(value="/hello/{id}",method=RequestMethod.POST) 8 public String helloPost(@PathVariable(value="id") Integer id){ 9 return "success"; 10 } 11 //REST請求方式-----PUT修改 12 @RequestMapping(value="/hello/{id}",method=RequestMethod.PUT) 13 public String helloPut(@PathVariable(value="id") Integer id){ 14 return "success"; 15 } 16 //REST請求方式-----DELETE刪除 17 @RequestMapping(value="/hello/{id}",method=RequestMethod.DELETE) 18 public String helloDelete(@PathVariable(value="id") Integer id){ 19 return "success"; 20 }
如何使用REST請求風格
(5)@RequestParam
@RequestParam可以接收請求的參數,相當於Servlet的getParameter()方法!
註意:要把@RequestParam和@PathVariable區分開:
三個默認屬性:
- value:這個字段要與請求參數的name屬性值一致!
- required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
- defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
1 //獲取請求參數信息 2 @RequestMapping(value="/helloReqParam") 3 public String helloReqParam(@RequestParam(value="username",required=false) String username){ 4 System.out.println("username-------"+username); 5 return SUCCESS; 6 }
(6)@RequestHeader
@RequestHeader:獲取請求頭信息,默認屬性:
- value:這個字段要與請求參數的name屬性值一致!
- required:布爾值,默認是true,當指定為false的時候,說明這個參數不是必須的,可以不帶!
- defaultValue:在我們不傳值的時候,默認使用defaultValue的值,傳遞參數的時候,使用我們傳遞的參數值!
1 //獲取請求頭信息 2 @RequestMapping(value="/helloReqHeader") 3 public String helloReqHeader(@RequestHeader(value="Accept",required=true,defaultValue="123") String accept){ 4 System.out.println("accept-------"+accept); 5 //accept-------text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 6 return "success"; 7 } 8 @RequestMapping(value="/helloReqHeader") 9 public String helloReqHeader(@RequestHeader(value="Accept1",required=true,defaultValue="123") String accept){ 10 System.out.println("accept-------"+accept);//accept-------123 11 return "success"; 12 } 13 @RequestMapping(value="/helloReqHeader") 14 public String helloReqHeader(@RequestHeader(value="Accept1",required=true) String accept){ 15 System.out.println("accept-------"+accept);//400錯誤 16 return "success"; 17 }
@RequestMapping映射請求,@PathVariable,@RequestParam,@RequestHeader的使用