ajax資料傳輸常見錯誤

2021-09-27 12:01:28 字數 3677 閱讀 4986

一般地,出現這種情況很大一部分原因是對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物件應該是這種結構:

class

passengers

但是如果我們了解過springmvc的引數繫結就應該知道,為了讓後台自動繫結好乙個完整的物件,他的querystring不應該是這樣

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,那麼一切問題也就解決了

於是,我寫了份轉換的**,如下:

//定義字元棧

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

"";

}

通過直接呼叫serialize(obj) 方法便可將複雜又多重巢狀的物件轉換成[2*]對應的querystring,於是,就可以直接提交給後台了,springmvc會自動幫你繫結好乙個完整的複雜+巢狀物件。

(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 此處使用了第三方動...