ajax 非同步請求向後臺傳陣列型別資料,後臺無法接收的原因
阿新 • • 發佈:2018-12-17
<select class="selectpicker" multiple id="orgList"> <option value="1">廣東省</option> <option value="2">廣西省</option> <option value="3">福建省</option> <option value="4">湖南省</option> <option value="5">山東省</option> </select>
頁面中使用了Bootstrap的多選下拉框mutiselect元件,其會將資料封裝成陣列,傳到後臺做批量處理,ajax普通的傳參方式,後臺無法接收的到,無論是陣列引數接收也好,還是request接收也好,都接收不到,那麼當然也可以通過URL傳,拼接字串,在這裡解決的就是無法傳陣列的問題。下面是ajax請求。
var orgList = $("#orgList").val(); var vendorId = $("#vendorId").val(); $.ajax({ url : BASE_PATH + "/base/vendorbase/checkVendorByOrgan.do", data : {"orgList":orgList,"vendorType":vendorType,"vendorId":vendorId}, dataType : 'json', type : 'post', success : function(data) { } });
下面是後臺的接收方法
@RequestMapping("checkVendorByOrgan") @ResponseBody public Map<String, Object> checkVendorByOrgan(String[] orgList) { String orgList[] = request.getParameter("orgList"); String vendorType = request.getParameter("vendorType"); String vendorId = request.getParameter("vendorId"); Map<String, Object> retMap = vendorBaseService.getVendorInfoByOrgan(orgList, vendorType, vendorId); return retMap; }
在這裡orgList為空接收不到的,request接接收的orgList也為空,接收不到引數,經過多方面的試探,查資料,只需在ajax請求時加上traditional: true,就可以解決了。這裡的原因是因為一般傳輸組是都是這樣寫data:{ 鍵:值1,值2······}。這樣寫後臺無法接收引數,因為jQuery在處理引數時會將引數序列化,呼叫jQuery.param(obj,traditional), traditional預設為false,會將引數深度序列化。但是servelt api無法處理,將traditional設定為true,阻止其深度序列化陣列物件,之後序列化結果就會是data:{ 鍵:值1,值2······} =====》鍵=值1&鍵=值2········