1. 程式人生 > >@PathVariable是什麼?詳情及用法解析

@PathVariable是什麼?詳情及用法解析

@PathVariable 對映 URL 繫結的佔位符

  • 帶佔位符的 URL 是 Spring3.0 新增的功能,該功能在SpringMVC 向 REST 目標挺進發展過程中具有里程碑的意義
  • 通過 @PathVariable 可以將 URL 中佔位符引數繫結到控制器處理方法的入參中:URL 中的 {xxx} 佔位符可以通過@PathVariable(“xxx“) 繫結到操作方法的入參中。

例項: 
SpringMVCTest.java

//@PathVariable可以用來對映URL中的佔位符到目標方法的引數中
@RequestMapping("/testPathVariable/{id}")
    public
String testPathVariable(@PathVariable("id") Integer id) { System.out.println("testPathVariable:"+id); return SUCCESS; }

index.jsp

<a href="springmvc/testPathVariable/1">testPathVariable</a>

3.2REST

  • REST:即 Representational State Transfer。(資源)表現層狀態轉化。是目前最流行的一種網際網路軟體架構。它結構清晰、符合標準、易於理解、擴充套件方便,所以正得到越來越多網站的採用
  • 資源(Resources):網路上的一個實體,或者說是網路上的一個具體資訊。它可以是一段文字、一張圖片、一首歌曲、一種服務,總之就是一個具體的存在。可以用一個URI(統一資源定位符)指向它,每種資源對應一個特定的 URI 。要獲取這個資源,訪問它的URI就可以,因此 URI 即為每一個資源的獨一無二的識別符。
  • 表現層(Representation):把資源具體呈現出來的形式,叫做它的表現層(Representation)。比如,文字可以用 txt 格式表現,也可以用 HTML 格式、XML 格式、JSON 格式表現,甚至可以採用二進位制格式。
  • 狀態轉化(State Transfer):每發出一個請求,就代表了客戶端和伺服器的一次互動過程。HTTP協議,是一個無狀態協議,即所有的狀態都儲存在伺服器端。因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生
    狀態轉化State Transfer)。而這種轉化是建立在表現層之上的,所以就是 表現層狀態轉化。具體說,就是 HTTP 協議裡面,四個表示操作方式的動詞:GETPOSTPUTDELETE。它們分別對應四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。

示例: 
- /order/1 HTTP GET :得到 id = 1 的 order 
- /order/1 HTTP DELETE:刪除 id = 1的 order 
- /order/1 HTTP PUT:更新id = 1的 order 
- /order HTTP POST:新增 order

HiddenHttpMethodFilter:瀏覽器 form 表單只支援 GET與 POST 請求,而DELETE、PUT 等 method 並不支援,Spring3.0 添加了一個過濾器,可以將這些請求轉換為標準的 http 方法,使得支援 GET、POST、PUT 與DELETE 請求。

3.2.1在web.xml中配置HiddenHttpMethodFilter

web.xml

 <!--
     配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST請求轉換成DELETE或者POST請求
      -->

   <filter>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>   

   <filter-mapping>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>

3.2.2在SpringMVCTest中測試相應的方法

SpringMVCTest.java

/*
     * 如何傳送PUT和DELETE請求
     * 1.需要配置HiddenHttpMethodFilter
     * 2.需要傳送POST請求
     * 3.需要傳送POST請求時攜帶一個name="_method"的隱藏域,value值為DELETE或者PUT
     * 
     * 在springmvc框架中通過@PathVariable註解來獲取id值
     * */
    //get請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
    public String testRest(@PathVariable Integer id)
    {
        System.out.println("testRest Get"+id);
        return SUCCESS;
    }

    //post請求
    @RequestMapping(value="/testRest",method=RequestMethod.POST)
    public String testRest()
    {
        System.out.println("testRest POST");
        return SUCCESS;
    }

    //delete請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
    public String testRestDelete(@PathVariable Integer id)
    {
        System.out.println("testRest DELETE"+id);
        return SUCCESS;
    }

    //修改請求
    @RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)
    public String testRestPut(@PathVariable Integer id)
    {
        System.out.println("testRest PUT"+id);
        return SUCCESS;
    }

3.2.3index.jsp中的寫法

index.jsp

    <a href="springmvc/testRest/1">Test Rest Get</a><br/>
    <form action="springmvc/testRest" method="post">
         <input type="submit" value="TestRest Post"/>
    </form><br/>
    <form action="springmvc/testRest/1" method="post">
         <input type="hidden" name="_method" value="DELETE"/>
         <input type="submit" value="TestRest DELETE"/>
    </form><br/>
    <form action="springmvc/testRest/1" method="post">
         <input type="hidden" name="_method" value="PUT"/>
         <input type="submit" value="TestRest PUT"/>
    </form><br/>