@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¶m2=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>