SpringBoot-@PathVariable

AlbenXie發表於2018-08-16

URL變數

在上一個部落格中,學習瞭如何在@Controller中建立@RequestMapping(或者響應的簡寫)來處理不同的URL請求。但是在Web應用中URL通常不是一成不變的,例如微博兩個不同使用者的個人主頁對應兩個不同的URL:http://weibo.com/user1,http://weibo.com/user2。我們不能對於每一個使用者都編寫一個被@RequestMapping註解的方法來處理其請求,也就是說,對於相同模式的URL(例如不同使用者的主頁,它們僅僅是URL中的某一部分不同,為他們各自的使用者名稱,我們說它們具有相同的模式)。

定義URL變數規則

可以在@RequestMapping註解中用{}來表明它的變數部分,例如:

@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/fpc

,URL變數username的值fpc會被賦給函式引數username,函式的返回值自然是userfpc。

在預設的情況下,Spring會對@PathVariable註解的變數進行自動賦值,當然你也可以指定@PathVariable使用哪一個URL中的變數:

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

執行結果:

 定義多個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變數