SpringMVC的controller提供了PUT和DELETE的請求方式

jaryle發表於2017-06-23

在Restful風格中,現有規定如下:

  1. GET(SELECT):從伺服器查詢,可以在伺服器通過請求的引數區分查詢的方式。  
  2. POST(CREATE):在伺服器新建一個資源,呼叫insert操作。  
  3. PUT(UPDATE):在伺服器更新資源,呼叫update操作。  
  4. DELETE(DELETE):從伺服器刪除資源,呼叫delete語句
瞭解這個風格定義以後,我們舉個例子:

如果當前url是 http://localhost:8080/User

那麼使用者只要請求這樣同一個URL就可以實現不同的增刪改查操作,例如

  1. http://localhost:8080/User?_method=get&id=1001  這樣就可以通過get請求獲取到資料庫 user表裡面 id=1001 的使用者資訊  
  2. http://localhost:8080/User?_method=post&id=1001&name=zhangsan  這樣可以向資料庫user 表裡面插入一條記錄  
  3. http://localhost:8080/User?_method=put&id=1001&name=lisi  這樣可以將 user表裡面 id=1001 的使用者名稱改為lisi  
  4. http://localhost:8080/User?_method=delete&id=1001  這樣用於將資料庫user 表裡面的id=1001 的資訊刪除 
這樣定義的規範我們就可以稱之為restful風格的API介面,我們可以通過同一個url來實現各種操作


在springMVC中實現restful風格開發

這裡,我通過訪問http://127.0.0.1:8080/ssmvc/restful介面的method不同來進入不同的controller方法,並列印返回資料。


  1. @RequestMapping(value = "/restful",method = RequestMethod.GET)  
  2.     public void list(HttpServletRequestrequest,HttpServletResponse response,TestVo vo) throws IOException {  
  3.        System.out.println("list被訪問,引數:" + vo.toString());  
  4.        Map<String,Object> map= newHashMap<String, Object>();  
  5.        map.put("params",vo);  
  6.        map.put("method",RequestMethod.GET);  
  7.        response.getWriter().write(JSON.toJSONString(map));  
  8.     }  
  9.      
  10.     /** 
  11.      * restful風格insert介面 
  12.      * @param request 
  13.      * @param response 
  14.      * @param vo 
  15.      * @throws IOException 
  16.      */  
  17.     @RequestMapping(value = "/restful",method = RequestMethod.POST)  
  18.     public voidupdate(HttpServletRequest request, HttpServletResponse response, TestVo vo) throws IOException {  
  19.        System.out.println("update被訪問,引數:" + vo.toString());  
  20.        Map<String,Object> map= newHashMap<String, Object>();  
  21.        map.put("params",vo);  
  22.        map.put("method",RequestMethod.POST);  
  23.        response.getWriter().write(JSON.toJSONString(map));  
  24.     }  
  25.      
  26.     /** 
  27.      * restful風格update介面 
  28.      * @param request 
  29.      * @param response 
  30.      * @param vo 
  31.      * @throws IOException 
  32.      */  
  33.     @RequestMapping(value = "/restful",method = RequestMethod.PUT)  
  34.     public void add(HttpServletRequest request, HttpServletResponse response, TestVo vo) throws IOException {  
  35.         System.out.println("add被訪問,引數:" + vo.toString());  
  36.        Map<String,Object> map= newHashMap<String, Object>();  
  37.        map.put("params",vo);  
  38.        map.put("method",RequestMethod.PUT);  
  39.        response.getWriter().write(JSON.toJSONString(map));  
  40.     }  

  1. /** 
  2.      * restful風格delete介面 
  3.      * @param request 
  4.      * @param response 
  5.      * @param vo 
  6.      * @throws IOException 
  7.      */  
  8.     @RequestMapping(value = "/restful/{id}",method = RequestMethod.DELETE)  
  9.     public void del(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") String id) throws IOException {  
  10.         System.out.println("delete被訪問,引數:"  + ", id:"+ id);  
  11.        Map<String,Object> map= newHashMap<String, Object>();  
  12.        map.put("params",id);  
  13.        map.put("method",RequestMethod.DELETE);  
  14.        response.getWriter().write(JSON.toJSONString(map));  
  15.     }  

這裡要注意一下

1.html表單form中,method沒有put、delete。

2.springMVC並不能直接接收到通過put、delete方式傳過來的引數。

我這裡的解決方式是

1.新增過濾器hiddenHttpMethodFilter,作用是將put和delete的引數獲取並重新放入request中,controller便可以直接拿到這些引數。

我們需要在web.xml中配置一個過濾器

<!-- 配置過濾器 將POST請求轉換為PUT和DELETE請求 -->
  <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>

需要注意的是,只有context-type:application/x-www-form-urlencoded的請求才會被過濾。


在表單上增加一個隱藏表單域,將HiddenHttpMethodFilter裡的_method屬性改為put或者delete後提交
因為只有form表單才具有post方法,而這個過濾器也只能將post方法轉化,get則不行。
比如你要提交一個刪除的請求
其Controller裡的方法對應的
@RequestMapping(value="deleteById/{id}",method = RequestMethod.DELETE)
 
//RESTFUL風格
<a class="del" href="deleteById/100">DELETE</a>//將ID為100的刪除
 
<form action="" method="post" id="delForm">
    <input type="hidden" name="_method" value="DELETE">
</form>
當然這種提交是要寫js的
$(function(){
    $('.del').click(function(){
        $('#delForm').attr('action',this.href).submit();
    })
})
這段js指令碼的意思就是
在點選<a>標籤刪除的時候將a標籤的href賦值給id為delForm的表單的action然後讓這個form
表單提交.這就完成了將POST請求轉換成DELETE請求,那麼PUT請求也可以同樣這樣做.

相關文章