SpringMVC:學習筆記(3)——REST
了解REST風格
按照傳統的開發方式,我們在實現CURD操作時,會寫多個映射路徑,比如對一本書的操作,我們會寫多個URL,可能如下
web/deleteBookById
web/updateBookById
web/addBook
web/getBookById
....
但是由於很難形成統一的URL命名規范,導致了URL命名的混亂。REST是面向資源的,URL的設計只需要將資源通過合理方式暴露出來即可。比如:
web/book
web/dog
....
資源暴露出來了,如何實現傳統開發方式的CURD呢?在REST設計規范中,只需將請求方法(GET:查詢、POST:新增、PUT:修改、DELETE:刪除)進行相對應的設置即可。
GET web/getDogs --> GET web/dogs 獲取所有小狗狗
GET web/addDogs --> POST web/dogs 添加一個小狗狗
GET web/editDogs/:dog_id --> PUT web/dogs/:dog_id 修改一個小狗狗
GET web/deleteDogs/:dog_id --> DELETE web/dogs/:dog_id 刪除一個小狗
SpringMVC如何識別REST請求
瀏覽器 form 表單只支持 GET與 POST 請求,而DELETE、PUT 等 method 並不支持。
Spring3.0 添加了一個過濾器,可以將這些請求轉換為標准的 http 方法,使得支持 GET、POST、PUT 與DELETE 請求.這個過濾器就是HiddenHttpMethodFilter。過濾器的實現原理大致如下:檢測請求參數中是否包含 _method這個參數,如果包含則獲取其值,然后判斷是哪種操作后繼續傳遞:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//methodParam="_method";
String paramValue = request.getParameter(this.methodParam);
if("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
HiddenHttpMethodFilter.HttpMethodRequestWrapper wrapper = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);
filterChain.doFilter(wrapper, response);
} else {
filterChain.doFilter(request, response);
}
}
實踐
1.配置過濾器HiddenHttpMethodFilter
我們再之前說了,SpringMVC的HiddenHttpMethodFilter過濾器可以把POST請求轉換為DELETE或PUT請求,所以我們先配置該過濾器。
2.在表單中攜帶隱藏域
說明:name="_method',value是具體的請求方法,DELETE、PUT、OPTION等;
3.在控制器中處理請求