3.三、URI 模板模式(Template Pattern)

    這一部分是對 Spring 5 文檔的直接翻譯,鏈接是這個。這一部分的示例再也不貼代碼,請到這個項目的 mvc 分支下查看,本篇示例的控制器名稱是 URITemplateController。html


    URI 模板能夠很方便地用於訪問一個 @RequestMapping 方法中的 URL 的被選擇的部分。
    URI 模板是一個像URI的字符串,它包含一個或多個變量名。當你用值來替代這些變量時,這個模板就會變成一個 URI。爲 URI 模板擬定的 RFC 文檔定義了一個 URI 是怎樣被參數化的。好比,URI 模板 http://www.example.com/users/{userId} 包含一個變量 userId。把值 fred 賦到這個變量中就產生了 http://www.example.com/users/...
    在 Spring MVC 中,你但是在一個方法參數上使用註解 @PathVariable,來把這個參數綁定到一個URI模板變量上:git

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) 
{
    Owner owner = ownerService.findOwner(ownerId);
    model.addAttribute("owner", owner);
    return "displayOwner";
}

    URI 模板 「/owners/{ownerId}」 指定了一個名叫 ownerId 的變量。當控制器處理這個請求時,ownerId 的值被設置爲從 URI 中解析出來的合適的部分。好比,當請求 /owners/fred 進來時,fred 就是 ownerId 的值。web

    爲了處理註解 @PathVariable,Spring MVC 須要按名找到匹配URI模板的變量。你能夠在這個註解中指定:正則表達式

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) 
{
    // implementation omitted
}

    若是 URI 模板變量名匹配方法參數名,那麼你能夠省略詳細配置。只要你的代碼在編譯時帶有調試信息或者在使用 Java 8 編譯時使用參數 -parameters,Spring MVC 就會匹配方法參數名到 URI 模板變量名:spring

@GetMapping("/owners/{ownerId}")
public String findOwner(@PathVariable String ownerId, Model model) 
{
    // implementation omitted
}

    一個方法能夠有任何數量的註解 @PathVariable:mvc

@GetMapping("/owners/{ownerId}/pets/{petId}")
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) 
{
    Owner owner = ownerService.findOwner(ownerId);
    Pet pet = owner.getPet(petId);
    model.addAttribute("pet", pet);
    return "displayPet";
}

    當在一個Map<String, String>參數上使用 @PathVariable 註解時,這個 Map 會被填上全部的 URI 模板變量。app

    一個 URI 模板能夠被集成到類和方法級別的@RequestMapping 註解上。方法 findPet() 能夠被一個 /owners/42/pets/21 這樣的 URI 調用。.net

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController 
{
    @RequestMapping("/pets/{petId}")
public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) 
{
        // implementation omitted
    }
}

    一個 @PathVariable 參數能夠是任何簡單類型,好比 int,long,Date 等。Spring 自動轉換到合適的類型,若是轉換失敗,就拋出一個 TypeMismatchException 異常。你也能夠註冊本身的數據類型轉換支持。參見「方法參數和類型轉換」和「自定義 WebDataBinder 初始化」。翻譯

    在定義URI模板變量時,你須要更高的精確度。考慮 URL「/spring-web/spring-web-3.0.5.jar」。你怎麼把它分紅幾部分呢?
    註解 @RequestMapping 支持在 URI 模板變量中使用正則表達式。語法 {varName:regex} 的第一部分定義了變量名,第二部分是一個正則表達式。例如:調試

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) 
{
    // ...
}
相關文章
相關標籤/搜索