SpringBoot-@PathVariable

URL變量

在上一個博客中,學習瞭如何在@Controller中建立@RequestMapping(或者響應的簡寫)來處理不一樣的URL請求。可是在Web應用中URL一般不是一成不變的,例如微博兩個不一樣用戶的我的主頁對應兩個不一樣的URL:http://weibo.com/user1,http://weibo.com/user2。咱們不能對於每個用戶都編寫一個被@RequestMapping註解的方法來處理其請求,也就是說,對於相同模式的URL(例如不一樣用戶的主頁,它們僅僅是URL中的某一部分不一樣,爲他們各自的用戶名,咱們說它們具備相同的模式)。正則表達式

定義URL變量規則

能夠在@RequestMapping註解中用{}來代表它的變量部分,例如:app

@RequestMapping("/users/{username}")

這裏{username}就是咱們定義的變量規則,username是變量的名字,那麼這個URL路由能夠匹配下列任意URL並進行處理:框架

  • /users/tianmaying
  • /users/ricky
  • users/tmy1234

須要注意的是,在默認狀況下,變量中不能夠包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即便你認爲tianmaying/ricky是一個存在的用戶名。函數

獲取URL變量

在路由中定義變量規則後,一般咱們須要在處理方法(也就是@RequestMapping註解的方法)中獲取這個URL的具體值,並根據這個值(例如用戶名)作相應的操做,SpringMVC提供的@PathVariable能夠幫助咱們:學習

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable String username){
//        return String.format("user %s", username);
        return "user" + username; 
    }

在上述例子中,當@Controller處理HTTP請求時,userProfile的參數username會自動設置爲URL中對應變量username(同名賦值)的值,例如當HTTP請求爲/users/fpcspa

,URL變量username的值fpc會被賦給函數參數username,函數的返回值天然是userfpc。code

在默認的狀況下,Spring會對@PathVariable註解的變量進行自動賦值,固然你也能夠指定@PathVariable使用哪個URL中的變量:orm

@RequestMapping("/users/{username}")
    @ResponseBody
    public String userProfile(@PathVariable("username") String username){
//        return String.format("user %s", username);
        return "user" + username; 
    }

運行結果:blog

 定義多個URL變量

能夠定義URL路由,其中包含多個URL變量:路由

@RequestMapping("/user/{username}/blog/{blogId}")
    @ResponseBody
    public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
        return "user: " + username + "blog->" + blogId;
    }

這種狀況下,Spring可以根據名字自動賦值對應的函數參數值,固然也能夠在@PathVariable中顯示地代表具體的URL變量值。

在默認狀況下,@PathVariable註解的參數能夠是一些基本的簡單類型:int,long,Date,String等,Spring能根據URL變量的具體值以及函數參數的類型來進行轉換,例如/user/fpc/blog/1,會將「fpc」的值賦給username,而1賦值給int變量blogId。

運行結果:

匹配正則表達式

不少時候,須要對URL變量進行更加精確的定義,例如-用戶名只可能包含小寫字母,數字,下劃線,咱們但願:

  • /user/fpc是一個合法的URL
  • /user/#$$$則不是一個合法的URL

除了簡單地定義{username}變量,還能夠定義正則表達式進行更精確的控制,定義語法是{變量名:正則表達式}[a-zA-Z0-9_]+是一個正則表達式,表示只能包含小寫字母,大寫字母,數字,下劃線。如此設置URL變量規則後,不合法的URL則不會被處理,直接由SpringMVC框架返回404Not Found。

@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")

總結

  • 在@RequestMapping註解中定義URL變量規則
  • 在@RequestMapping註解方法中獲取URL變量-@PathVariable
  • @PathVariable指定URL變量名
  • 定義多個URL變量
  • 用正則表達式精肯定義URL變量
相關文章
相關標籤/搜索