今天忽然想學習一下Restful風,詳細的我就不贅述了,個人理解是同一個請求路徑根據請求方式不一樣進行不一樣的處理javascript
如四種提交方式,這裏推薦一個插件Postman,能夠模仿各類請求類型,自行百度安裝吧php
GET(SELECT):從服務器查詢,能夠在服務器經過請求的參數區分查詢的方式。
POST(CREATE):在服務器新建一個資源,調用insert操做。
PUT(UPDATE):在服務器更新資源,調用update操做。
DELETE(DELETE):從服務器刪除資源,調用delete語句
下面進行實踐html
前端簡易代碼前端
<a href="#" onclick="add()">添加</a> <a href="#" onclick="del()">刪除</a> <a href="#" onclick="select()">查詢</a> <a href="#" onclick="update()">修改</a> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> <script type="text/javascript"> function add(){ var id = "111111111"; $.ajax({ type:"POST", url:"test.do", data:{id:"添加11111111111"}}); } function del(){ var id = "2222222"; $.ajax({ type:"DELETE", url:"test.do", data:{id:"刪除22222222222"}, contentType : "text/html;charset=UTF-8", dataType:"json"}); } function select(){ var id = "33333"; $.ajax({ type:"GET", url:"test.do", data:{id:"查詢3333333333"}}); } function update(){ var id = "111111111"; $.ajax({ type:"PUT", url:"test.do", data:{id:"修改4444444"}}); } </script>
後臺簡易代碼java
@RequestMapping(value = "/test.do", method = RequestMethod.DELETE) public void test(String id){ System.out.println("刪除"); System.out.println(id); } @RequestMapping(value = "/test.do", method = RequestMethod.POST) public void test1(String id){ System.out.println("添加"); System.out.println(id); } @RequestMapping(value = "/test.do", method = RequestMethod.PUT) public void test2(String id){ System.out.println("修改"); System.out.println(id); } @RequestMapping(value = "/test.do", method = RequestMethod.GET) public void test3(String id){ System.out.println("查詢"); System.out.println(id); }
前臺ajax的提交方式對應於後臺@RequestMapping(value = "/test.do", method = RequestMethod.方式)jquery
控制檯:web
添加 添加11111111111 2018-10-26 09:28:45.325 DEBUG 8500 --- [nio-8080-exec-4] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2 2018-10-26 09:28:45.977 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@718e55d2 刪除 null 2018-10-26 09:28:45.984 DEBUG 8500 --- [nio-8080-exec-8] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2 2018-10-26 09:28:46.731 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@718e55d2 查詢 查詢3333333333 2018-10-26 09:28:46.734 DEBUG 8500 --- [nio-8080-exec-9] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@718e55d2 2018-10-26 09:28:47.585 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@535448c 修改 修改4444444 2018-10-26 09:28:47.590 DEBUG 8500 --- [nio-8080-exec-5] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.springframework.web.filter.HttpPutFormContentFilter$HttpPutFormContentRequestWrapper@535448c
可見Restful已經根據不一樣的提交方式進入不一樣的方法了,後面你們就能夠自行處理了,可是還有一個問題,當提交方式爲DELETE時,接收的id值爲nullajax
在參數列表中加入@RequestBody註解,這裏的做用是經過@requestBody能夠將請求體中的JSON字符串綁定到相應的bean上,也能夠將其分別綁定到對應的字符串上。spring
@RequestMapping(value = "/lll.do", method = RequestMethod.DELETE) public void test(@RequestBody String id){ System.out.println("刪除"); System.out.println(id); }
控制檯:apache
2018-10-26 10:31:09.661 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@4bafd197 刪除 id=%E5%88%A0%E9%99%A422222222222 2018-10-26 10:31:09.667 DEBUG 2720 --- [nio-8080-exec-1] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@4bafd197
能夠看到,是能夠獲取到數據了,可是會出現中文亂碼,這個中文亂碼超級頑固,設置了不少都沒用,最後在前臺這樣設置就能夠了
function del(){ var id = "刪除sssss22222222222"; $.ajax({ type:"DELETE", url:"lll.do", data:JSON.stringify(id), contentType :"application/json", dataType:"json"}); }
JSON.stringify() 方法用於將 JavaScript 值轉換爲 JSON 字符串。
這樣控制檯的輸出就變成了:
2018-10-26 13:42:59.585 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter : Bound request context to thread: org.apache.catalina.connector.RequestFacade@343dbcb6
刪除
"刪除sssss22222222222"
2018-10-26 13:42:59.587 DEBUG 8364 --- [nio-8080-exec-7] o.s.b.w.f.OrderedRequestContextFilter : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@343dbcb6
爲何參數變成字符串就不亂碼了呢?原來@RequestBody主要用來接收前端傳遞給後端的json字符串中的數據的,注意必定是字符串
這裏給出JSON字符串和JSON對象的區別
JSON字符串 var data ='{"id":"刪除sssss22222222222"}';//字符串是單引號或者雙引號引發來的 JSON對象 var data ={"id":"刪除sssss22222222222"};
全部上面的JSON.stringify()還能夠改爲聲明成JSON字符串傳輸
JSON對象轉JSON字符串能夠用JSON.stringify()方法
反過來JSON字符串轉JSON對象能夠用JSON.parse()方法
$.ajax({
url : 'login.php',
type : 'post',
data : {id:id,name:name}, //這裏是json對象
success : function(data){......}
)};
默認是以application/x-www-form-urlencoded方式提交。也就是常見的表單提交方式
若是使用ajax的application/json方式,記得data參數是字符串類型的。使用JSON.stringify()轉換一下
至於何時用@RequestBody呢?
GET、POST方式提時, 根據request header Content-Type的值來判斷: application/x-www-form-urlencoded, 可選(即非必須,由於這種狀況的數據@RequestParam, @ModelAttribute也能夠處理,固然@RequestBody也能處理); multipart/form-data, 不能處理(即便用@RequestBody不能處理這種格式的數據); 其餘格式, 必須(其餘格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理)。