【SpringMVC筆記整理六】RESTful風格

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/104613756







RESTful(Representational State Transfer,資源表現層狀態轉換),說的專業點它是一種交互類的軟件設計風格的架構。其實我認爲它就是一個 HTTP 請求方法的規則而以,我們傳統的請求方法有 GETPOST,而 RESTful 風格的請求方法有 GET、POST、PUT、DELETE 四種請求方法,這四種請求方法分別代表四種 CRUD 的資源操作:

  • GET: 用來獲取資源(R);
  • POST: 用來創建資源(C);
  • PUT: 用來修改資源(U);
  • DELETE: 用來刪除資源(D)。

對於 RESTful 架構也有很多好處:

  1. URL 傳參更加簡潔:

    傳統的 URL:http://localhost:8080/test?id=1

    RESTful:http://localhost:8080/test/1

  2. 完成不同終端之間的資源共享,RESTful 提供了一套規範,不同終端之間只需要遵守該規範,就可以實現數據交互。

Spring MVC 默認是支持 RESTful 架構。本篇博客主要講解 Spring MVC 中的 RESTful 架構。


一、HiddenHttpMethodFilter

在頁面表單中只支持 GETPOST 的請求方法,不支持 PUTDELETE,爲了支持 PUTDELETE,在 Spring 3.0 的時候添加了一個過濾器,可以將這些請求轉換爲標準的 HTTP 方法,使得支持 GET、POST、PUT 和 DELETE 請求,該過濾器就是 HiddenHttpMethodFilter

HiddenHttpMethodFilter 過濾器是可以檢測請求參數中是否包含了 _method 參數,如果包含則獲取該參數的值,將值作爲請求的方法。

以下是一個接收 PUTDELETE 請求方法的小例子:

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 來測試 PUTDELETE 時,可能會在瀏覽器中報 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";   // 轉發後面必須跟完整的視圖
}


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章