版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/104613756
文章目錄
RESTful(Representational State Transfer,資源表現層狀態轉換),說的專業點它是一種交互類的軟件設計風格的架構。其實我認爲它就是一個 HTTP 請求方法的規則而以,我們傳統的請求方法有 GET 和 POST,而 RESTful 風格的請求方法有 GET、POST、PUT、DELETE 四種請求方法,這四種請求方法分別代表四種 CRUD 的資源操作:
- GET: 用來獲取資源(R);
- POST: 用來創建資源(C);
- PUT: 用來修改資源(U);
- DELETE: 用來刪除資源(D)。
對於 RESTful 架構也有很多好處:
URL 傳參更加簡潔:
傳統的 URL:http://localhost:8080/test?id=1
RESTful:http://localhost:8080/test/1
完成不同終端之間的資源共享,RESTful 提供了一套規範,不同終端之間只需要遵守該規範,就可以實現數據交互。
Spring MVC 默認是支持 RESTful 架構。本篇博客主要講解 Spring MVC 中的 RESTful 架構。
一、HiddenHttpMethodFilter
在頁面表單中只支持 GET 和 POST 的請求方法,不支持 PUT 和 DELETE,爲了支持 PUT 和 DELETE,在 Spring 3.0 的時候添加了一個過濾器,可以將這些請求轉換爲標準的 HTTP 方法,使得支持 GET、POST、PUT 和 DELETE 請求,該過濾器就是 HiddenHttpMethodFilter。
HiddenHttpMethodFilter 過濾器是可以檢測請求參數中是否包含了
_method
參數,如果包含則獲取該參數的值,將值作爲請求的方法。以下是一個接收 PUT 和 DELETE 請求方法的小例子:
1、配置 HiddenHttpMethodFilter 過濾器
我們需要先在
web.xml
中配置 HiddenHttpMethodFilter 過濾器。
<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>
2、PUT 和 DELETE 的表單
在 form 表單中添加隱藏域標籤,
name="_method"
和value="PUT" 或 value="DELETE"
。
<!-- PUT 表單 -->
<form action="/rest/put" method="post">
<input type="hidden" name="_method" value="PUT"/>
<input type="submit"/>
</form>
<!-- DELETE 表單 -->
<form action="/rest/delete" method="post">
<input type="hidden" name="_method" value="DELETE"/>
<input type="submit"/>
</form>
3、測試控制器
寫一個控制器,用於測試接收 PUT 的業務方法 和 測試接收 DELETE 的業務方法:
@Controller
@RequestMapping("/rest")
public class RestHandler {
// 用來接收 PUT 請求方法
@RequestMapping(value = "/put", method = RequestMethod.PUT)
@ResponseBody
public String rest(){
System.out.println("rest");
return "PUT";
}
// 用來接收 DELETE 請求方法
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
@ResponseBody
public String delete(){
System.out.println("delete");
return "DELETE";
}
}
4、可能會出現的問題
也許你在使用 Spring MVC 來測試 PUT 或 DELETE 時,可能會在瀏覽器中報 405 錯誤,但在控制檯沒有報錯,一切正常。
你可以參考我之前寫的博客:[SpringMVC中寫DELETE或PUT時遇到405錯誤
二、RESTful 帶來的四個註解
RESTful 也爲我們帶來了可以簡化代碼書寫的四個註解,它們的用法與 @RequestMapping 註解 相同,可以簡化
method=RequestMethod.XXX
這句代碼,但只能用在方法上,不能用在類上。如下:
1、@GetMapping
@GetMapping 註解 是 GET 映射註解,URL 的 GET 請求,在 Restful API 中代表查找。
@GetMapping("/get")
// 等價於
@RequestMapping(value = "/get", method = RequestMethod.GET)
2、@PostMapping
@PostMapping 註解 是 POST 映射註解,URL 的 GET 請求,在 Restful API 中代表添加。
@PostMapping("/post")
// 等價於
@RequestMapping(value = "/post", method = RequestMethod.POST)
3、@PutMapping
@PutMapping 註解 是 PUT 映射註解,URL 的 PUT 請求,在 Restful API 中代表更新。
@PutMapping("/put")
// 等價於
@RequestMapping(value = "/put", method = RequestMethod.PUT)
4、@DeleteMapping
@DeleteMapping 註解 是 DELETE 映射註解,URL 的 DELETE 請求,在 Restful API 中代表刪除。
@DeleteMapping("/delete")
// 等價於
@RequestMapping(value = "/delete", method = RequestMethod.DELETE)
三、JSP 頁面的轉發和重定向
在 Spring MVC 中默認以轉發的形式來響應 JSP(如果瀏覽器地址欄沒有改變,那就是轉發),我們也可以手動設置爲重定向,但在其後面必須跟完整的視圖 URL。
// 重定向
@RequestMapping("/test")
public String test() {
return "redirect:/test.jsp"; // 重定向後面必須跟完整的視圖
}
轉發也能這樣寫:
// 轉發
@RequestMapping("/test")
public String test() {
return "forward:/test.jsp"; // 轉發後面必須跟完整的視圖
}