1. 程式人生 > >ajax 非同步請求向後臺傳陣列型別資料,後臺無法接收的原因

ajax 非同步請求向後臺傳陣列型別資料,後臺無法接收的原因

<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········