.ajax向后台傳遞數組(轉)


js部分代碼

//創建一個測試數組
var boxIds = new Array();
boxIds.push(12182);
boxIds.push(12183);
boxIds.push(12184);
//向后台交互
$.ajax({
  url: "/xxx",
  type: "GET",
  data: {
    "boxIds": boxIds,
    "boxType": 0,
    "time": new Date().getTime()
  },
  success: function(data) {
    //do sth...
  }
});

后台controller代碼(SpringMVC)

@ResponseBody
@RequestMapping(value = "/box/changeLock")
public String changeLock(final Long[] boxIds, final int boxType) {
  return locker_ChangeLockService.changeLock(boxIds, boxType);
}

觀察瀏覽器中發送的請求,可以發現參數如下:

可以看到,參數的名字為boxIds[]而不是我們所定義的boxIds,也就是說,當傳遞數組時,會在我們的數組名稱后自動加上”[]”,所以后台接不到。

解決辦法: 

設置jQuery.ajax的tradional屬性 :traditional: true,//這里設置為true

$.ajax({
  url: "/xxx",
  type: "GET",
  data: {
    "boxIds": boxIds,
    "boxType": 0,
    "time": new Date().getTime()
  },
  traditional: true,//這里設置為true
  success: function(data) {
    //do sth...
  }
});

修改之后重新發出請求,觀察瀏覽器:

請求參數2

這次參數不帶”[]”了,並且后台可以成功接收到該數組。

 

需要特別注意下traditional默認值是false。ajax做數據處理時,是通過jQuery.param( obj, traditional )該方法進行處理。
jquery1.4版本以后
traditional參數,默認false的時候如果是{a:{b:'value'}}是處理成a[b],這樣形式,如果是數組:data:{a:[1,2]},是解析成a[]=1&a[]=2,這種方式后台確實要做兼容(取a[b]或a[])來取值。
在數組情況下把traditional參數設置成true,是解析成a=1&a=2,對后台直接通過a拿數據。但是實驗了下object情況,把traditional設置成true,轉成了a=[object+Object],這樣就是費的了。false時解析成上面的形式應該就是類型指示作用,我看到這種格式就知道請求數據是Array還是object了,true就是按照form提交的方式傳值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM