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提交的方式傳值。