一般地,出現這種情況很大一部分原因是對ajax中的引數作用不熟悉或者對@requestbody註解不熟悉。
text/html : html格式
text/plain :純文字格式
text/xml : xml格式
等等。。。
$.ajax( , //查詢字串的對映形式(即物件),在預設模式下提交時會自動地轉化成查詢字串
也可以這麼傳:
$.ajax(,
]}passengers[
0][name]=egor&passengers[
0][role]=pilot&passengers[
1][name]=dhh&passengers[
1][role]=
2pilot
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
a[a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a][a]=you
're outta ram
然後根據springmvc切割key/value查詢字串的特點,我們試著在controller的方法裡宣告下對應的key
可以看到後台成功取到了對應的值
其實不管他巢狀的再多,哪怕是上面多重巢狀的a[a][a][a][a][a]...,其本質上都只是querystring的乙個key而已,所以只要是正確的key,後台都能取到對應的值
看到這裡可能有人要問了,雖然上面證明了可以從複雜+巢狀的結構中取到特定的值,但是自己想要的並不只是侷限於取到特定的值,而是希望後台自動給我封裝成乙個物件,即我能直接從controller的方法引數中拿到乙個完整的複雜巢狀物件。只不過,這樣行的通嗎?
解決問題的出發點其實還是原來的原則,即如何將複雜物件序列化成springmvc能認識的querystring[1*],只不過這裡有些小區別,更貼切的講應該是如何將複雜物件序列化成springmvc能進行巢狀繫結的querystring[2*]。
[1*]和[2*]對應的字串是有區別的,舉個例子,還是上面的那個passenger物件:
,]}
後台對應的bean物件應該是這種結構:
但是如果我們了解過springmvc的引數繫結就應該知道,為了讓後台自動繫結好乙個完整的物件,他的querystring不應該是這樣class
passengers
passengers[0][name]=egor&passengers[0][role]=pilot&passengers[1][name]=dhh&passengers[1][role]=2pilot
而應該是這樣(即[2*]所對應的querystring):
passengers[0].name=egor&passengers[0].role=pilot&passengers[1].name=dhh&passengers[1].role=2pilot
也就是說,如果能將jquery.param序列化後的querystring轉化成[2*]對應的querystring,那麼一切問題也就解決了
於是,我寫了份轉換的**,如下:
通過直接呼叫serialize(obj) 方法便可將複雜又多重巢狀的物件轉換成[2*]對應的querystring,於是,就可以直接提交給後台了,springmvc會自動幫你繫結好乙個完整的複雜+巢狀物件。//定義字元棧
var stack_chars = ;
//定義括號棧
var stack_parentheses = ;
//定義這個下標變數是為了解決 ——> arr=1&arr=2&arr=3 這種情況
//因為 arr=1&arr=2&arr=3 應該變成 arr[0]=1&arr[1]=2&arr[2]=3,所以定義了stackidx是為了完成括號裡下標的遞增
var stackidx =
-1;//判斷當前讀取的字元是否在中
function
inparentheses()
//通過呼叫該方法完成將複雜物件obj轉換成springmvc支援巢狀繫結的querystring
function
serialize(obj)
else
else }}
return serializestr;
}function
checkcharsstack()
while ((c = arr.pop()) !==
undefined)
//出桟
stack_parentheses.pop();
stack_parentheses.pop();
//如果符號棧為空只能說明jquery序列化了沒有key的陣列,即序列化了這種 ——> arr=1&arr=2&arr=3
if(str ===
"")else
//如果是其他字元,比如arr[1][name]應該轉化成arr[1].name
if (
isnan(
parseint(str)))
else
}return
"";
}
(js檔案傳到碼雲上了點這裡,裡面有更詳細說明)
下面我們來測試乙個複雜而又多重巢狀的物件:
後台情況:
瀏覽器列印後台返回結果:
一般地,出現這種情況很大一部分原因是對ajax中的引數作用不熟悉或者對@requestbody註解不熟悉。
原生Ajax實現非同步資料傳輸
描述 不用前端js框架 如jquery dojo ext proptype等 的原生ajax,非同步實現與後台的資料傳輸,不依賴任何js包 注 所有js 均位於某乙個js檔案中,呼叫函式只需要引入該檔案 1.建立xmlhttprequest物件 全域性變數,記錄建立的xmlhttprequest物件...
ajax用json實現資料傳輸
json j ascript object notation 是一種輕量級的資料交換格式。它基於ecmascript的乙個子集。json採用完全獨立於語言的文字格式,但是也使用了類似於c語言家族的習慣 包括c c c j a j ascript perl python等 這些特性使json成為理想的...
C SFTP資料傳輸
我們有些客戶公司的資料比較重要,為了安全集團公司內部都使用的是區域網,但是有時候又不得不予外界網際網路做資料互動,所以有些不重要的系統是放在外界網際網路的,這樣以來內部系統和外部系統的資料互動就成為了問題,這樣以來就使用到了sftp伺服器來作為資料傳輸的中介。下面不說了,直接上c 此處使用了第三方動...