@RequestMapping 註解(2)

  • 2020 年 3 月 18 日
  • 筆記

SpringMVC 使用@RequestMapping註解為控制器指定可以處理哪些URL請求,在控制器的類定義及方法定義處都可標註:

  • 類定義處:提供初步的請求映射資訊。相當於WEB應用的根目錄
@Controller  @RequestMapping("/springmvc")  public class HelloWorld {      @RequestMapping("/helloworld")      public String hello(){          System.out.println("hello world");          return "success";      }  }  // 請求的URL  <a href="springmvc/helloworld">Hello World!</a>
  • 方法處:提供進一步的細分映射資訊。相對於類定義處的URL。若類定義處未標註,則方法處標記的URL相當於WEB應用的根目錄
@Controller  public class HelloWorld {      @RequestMapping("/helloworld")      public String hello(){          System.out.println("hello world");          return "success";      }  }  // 請求的URL  <a href="helloworld">Hello World!</a>

@RequestMapping的value、method、params及heads分別表示請求URL、請求方法、請求參數及請求頭的映射條件,聯合使用多個條件可讓請求映射更加精確化

params

@RequestMapping(value = "/helloworld01",params = "myParam=myValue") // 請求必須包含名為param1的請求參數,且值為myValue      public String hello01(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld02",params = "myParam") // 請求必須包含名為param1的請求參數      public String hello02(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld03",params = "!myParam!") // 請求不能包含名為param1的請求參數      public String hello03(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld04",params = "myParam!=myValue") // 請求必須包含名為param1的請求參數,但值不能為value1      public String hello04(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld05",params = {"param1=value1","param2"}) // 請求必須包含名為param1和param2的請求參數,且param1參數的值必須為value1      public String hello05(){          System.out.println("hello world");          return "success";      }

在index.jsp中驗證params

<a href="springmvc/helloworld02?myParam">test param</a>  <a href="springmvc/helloworld03?myParammmmmm">test !param</a>  <a href="springmvc/helloworld04?myParam=myValueeeeeeee">test param1!=value1</a>  <a href="springmvc/helloworld05?param1=value1&param2=2222">test {"param1 = value1","param2"}</a>

Ant 風格資源地址支援3種匹配符:

    @RequestMapping(value = "/helloworld06/*/abc") //中間的*可以替代任意數量字元      public String hello06(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld07/**/abc") //中間的**可以匹配任意層級,或者/helloworld06/abc      public String hello07(){          System.out.println("hello world");          return "success";      }        @RequestMapping(value = "/helloworld08/abc??") //一個?匹配一個字元      public String hello08(){          System.out.println("hello world");          return "success";      }
<a href="springmvc/helloworld06/aaaaaabbb/abc">test ant*</a>  <br><br>  <a href="springmvc/helloworld07/aaaaaabbb/ggggggg/hhhhhhh/abc">test ant**</a>  <br><br>  <a href="springmvc/helloworld07/abc">test ant**hhhh</a>  <br><br>  <a href="springmvc/helloworld08/abc11">test ant??</a>

@PathVariable註解 映射URL綁定的佔位符

URL中的{xxx}佔位符可以通過@PathVariable("xxx")綁定到操作方法的入參中

@Controller  @RequestMapping("/springmvc")  public class HelloWorld {      @RequestMapping("/helloworld/{id}")      public String hello(@PathVariable("id") Integer id){          System.out.println("hello world" + id);          return "success";      }  }  // 請求的URL  <a href="/springmvc/helloworld/1">qqq</a>

HiddenHttpMethodFilter 過濾器

REST 簡介

  • REST:(資源)表現層狀態轉化。是目前最流行的一種互聯網軟體架構
  • 資源:網路上的一個實體,或者說是網路上的一個具體資訊。它可以是一段文本、一張圖片等等,每種資源對應一個特定的URI。因此URI即為每一個資源的獨一無二的標識符
  • 表現層:把資源具體呈現出來的形式。比如,文本可以用txt格式表現,也可以用HTML格式、XML格式等
  • 狀態轉化:每發出一個請求,就代表了客戶端和伺服器的一次交互過程。HTTP協議,是一個無狀態協議,即所有的狀態都保存在伺服器端,因此,如果客戶端想要操作伺服器,必須通過某種手段,讓伺服器端發生「狀態轉化」,而這種轉化是建立在表現層之上的,所以就是「表現層狀態轉化」。具體說,就是HTTP協議裡面,四個表示操作方式的動詞:GET、POST、DELETE、PUT,它們分別對應四種基本操作:獲取資源、新建資源、刪除資源、更新資源
/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

瀏覽器form表單只支援GET和POST請求,而DELETE、PUT等method並不支援,HiddenHttpMethodFilter可以將這些請求轉換為標準的http方法,使得支援GET、POST、PUT與DELETE請求

web.xml增加HiddenHttpMethodFilter的配置

// web.xml  <!DOCTYPE web-app PUBLIC   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"   "http://java.sun.com/dtd/web-app_2_3.dtd" >  <web-app>      <display-name>Archetype Created Web Application</display-name>      <context-param>          <param-name>contextConfigLocation</param-name>          <param-value>/WEB-INF/applicationContext.xml</param-value>      </context-param>      <!-- 配置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>        <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      </listener>      <servlet>          <servlet-name>dispatcher</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <load-on-startup>1</load-on-startup>      </servlet>      <servlet-mapping>          <servlet-name>dispatcher</servlet-name>          <url-pattern>/</url-pattern>      </servlet-mapping>  </web-app>
@Controller  @RequestMapping("/springmvc")  public class HelloWorld {       /**       * 如何發送PUT請求和DELETE請求呢?       * 1。 配置HiddenHttpMethodFilter       * 2。發送POST請求,並攜帶一個name="_method"的隱藏域,值為DELETE 或 PUT       * @param id       * @return       */      @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.GET)      public String testRestGet(@PathVariable Integer id){          System.out.println("GET" + id);          return "success";      }        @RequestMapping(value = "/helloworld",method = RequestMethod.POST)      public String testRestPost(){          System.out.println("POST");          return "success";      }        @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.DELETE)      public String testRestDelete(@PathVariable Integer id){          System.out.println("DELETE" + id);          return "success";      }        @RequestMapping(value = "/helloworld/{id}",method = RequestMethod.PUT)      public String testRestPut(@PathVariable Integer id){          System.out.println("PUT" + id);          return "success";      }  }
<%--GET請求--%>  <a href="/springmvc/helloworld/1">GET</a>    <%--POST請求--%>  <form action="springmvc/helloworld" method="post">      <input type="submit" value="POST">  </form>    <%--DELETE請求--%>  <form action="/springmvc/helloworld/1" method="post">      <input type="hidden" name="_method" value="DELETE">      <input type="submit" value="DELETE">  </form>    <%--PUT請求--%>  <form action="/springmvc/helloworld/1" method="post">      <input type="hidden" name="_method" value="PUT">      <input type="submit" value="PUT">  </form>