1. 程式人生 > >springMVC produces和ajax accept引數的配合使用

springMVC produces和ajax accept引數的配合使用

我的風格就是  列出例子,不過多的講理論。

一切從一個普通的前端ajax請求jspringMVC後端的例子開始,

前端jQuery ajax 請求:

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. $.ajax({  
  2.                 url: getAbsoluteUrl('score/findScore'),  
  3.                 type: 'POST',  
  4.                 dataType: 'json',    //第1處
  5.                 success: function (res) {  
  6.                     alert(res);  
  7.                 },  
  8.                 error: function (msg) {  
  9.                   alert(msg);  
  10.                 }  
  11.             });  
後端 springMVC程式碼
  1. @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json")  
  2.     public@ResponseBody
     Map findScore(Model model, ServletRequest request) {  
  3.         Map<String , Object> map = new LinkedHashMap<String, Object>();  
  4.         map.put("createdUser","jiabaochina");  
  5.         map.put("score"5);  
  6.         map.put("status""success");  
  7.         return map;  
  8.     }  
以上的程式碼是沒有問題的,請求後會直接alert一個js物件。

這是因為ajax請求dataType值為json,jquery就會把後端返回的json字串嘗試通過JSON.parse()嘗試解析為js物件。

http協議response返回值無論是json字串還是普通text文字還是html文字,本質上講,http response響應體就是文字內容。

而 jquery ajax 根據datatype來解析返回的文字,

簡單講datatype=‘text’時,jquery直接返回字串。

datatype=‘json’時,jquery會呼叫JSON.parse()解析字串為js物件並且返回。

當datatype=‘html’時,jquery會在把html插入dom之前執行字串包含的js程式碼。

看完ajax後臺我們再看下springmvc後臺,@responseBody的作用是方法返回的資料不經過檢視解析,直接把map寫到response響應體中。

@requesMapping的作用是通過其所帶的value、method等值來決定是否處理該請求。

如以上

  1. @RequestMapping(value = "findScore", method = RequestMethod.POST, produces = "application/json"
含義是 :findScore對應url地址;metohd對應請求方法型別,只處理post請求。 那produces = "application/json"是什麼意思呢? 此種方式相對使用@RequestMapping的“headers = "Accept=application/json"”更能表明你的目的。 其實produces = "application/json"和headers = "Accept=application/json"是一個意思。  此方法只處理 request 請求頭中accept 為 "application/json"或者能夠包含"application/json"的值,如“*/*”。

來,跑個例子。修改下上面的ajax請求

[javascript] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
  1. $.ajax({  
  2.                 url: getAbsoluteUrl('score/findScore'), 
  3. headers: {
                        Accept: "text/plain; charset=utf-8"
                    }, 
  4.                 type: 'POST',  
  5.                 dataType: 'json',    //第1處
  6.                 success: function (res) {  
  7.                     alert(res);  
  8.                 },  
  9.                 error: function (msg) {  
  10.                   alert(msg);  
  11.                 }  
  12.             });  

在Prototyp(1.5)的Ajax程式碼封裝中,將Accept預設設定為“text/javascript, text/html, application/xml, text/xml, */*”。這是因為Ajax預設獲取伺服器返回的Json資料模式。所以設定headers,強行制定ajax請求頭 accept為“text/plain”。

結果,後端的方法都沒進入,直接tomcat返回406錯誤。

結果和意義:

在普通的web專案中,前後端溝通很方便,甚至前後端是一個人在開發。這樣produces = "application/json"就沒有意義。

只有當在開發資料介面時,特別是呼叫方和開發方距離很遠時,通過request請求accept和produces = "application/json"的配合,

能很好的限定資料的格式,確保萬無一失。

有任何錯誤或疑問,請留言。

參考資料:

http://www.studyofnet.com/news/166.html

http://blog.csdn.net/lzwglory/article/details/17252099