前言
最近因?yàn)楣ぷ鞯男枰趯懸粋€(gè)基于springmvc+spring+mybatis的項(xiàng)目,其中涉及用ajax向controller發(fā)送數(shù)據(jù)的功能。因?yàn)椴幌胧褂胹pring的form標(biāo)簽,所以想看看有沒(méi)有方法將ajax中的json數(shù)據(jù)直接轉(zhuǎn)化為controller方法中的對(duì)象接收并處理。以下將逐漸介紹各種不同情況下傳遞json數(shù)據(jù)并封裝的方法,下面話不多說(shuō),一起來(lái)看看詳細(xì)的介紹:
基礎(chǔ)類型
如果傳遞的json數(shù)據(jù)為基礎(chǔ)類型(Int,String等)的話,則只需要用@RequestParam標(biāo)注方法中的參數(shù)就行了。
ajax代碼
1
2
3
4
5
6
7
8
9
|
$.ajax({ url : "someurl" , type : "POST" , dataType : "JSON" , data : { "name" : "test" , "password" : "testpassword" }, success : function (data) { console.log(data) } }) |
java代碼
1
2
3
4
|
@RequestMapping ( "someurl" ) public @ResponseBody SomeData basicType( @RequestParam String name, @RequestParam String password){ //具體方法 } |
在這里@ResponseBody
說(shuō)明返回的是一個(gè)對(duì)象。@RequestParam
的用法還很多,具體可以去參考springmvc的文檔
簡(jiǎn)單的對(duì)象類型
簡(jiǎn)單的對(duì)象類型是指,在對(duì)象中不包含復(fù)雜的數(shù)據(jù)結(jié)構(gòu)類似于list,map等。在這里可以使用標(biāo)簽@ModelAttribute
來(lái)直接將JSON數(shù)據(jù)封裝成對(duì)象。
假設(shè)我們有一個(gè)用戶對(duì)象,用戶的屬性包括name,age
1
2
3
4
5
|
public class User{ private String name; private int age; //getters and setters } |
ajax傳輸?shù)臄?shù)據(jù)如下
1
2
3
4
5
6
7
8
9
10
11
12
|
$.ajax({ url : "someurl" , type : "POST" , dataType : "JSON" , data : { 'name : ' test ', ' age' : 10 }, success : function (data) { console.log(data) } }) |
controller中的代碼如下
1
2
3
4
|
@RequestMapping ( "someurl" ) public @ResponseBody SomeData objects( @ModelAttribute User user){ //具體方法 } |
springmvc 暫時(shí)不支持接收并生成多個(gè)modelAttribute
數(shù)組類型
有些情況下,可能需要傳遞一組相同類型的數(shù)據(jù),比如添加一組用戶的信息。這是可以通過(guò)ajax傳遞一個(gè)數(shù)組給controller方法。具體情況可以參考這個(gè)回答
這個(gè)回答給的非常的詳細(xì)具體,需要補(bǔ)充的是,接收端的數(shù)據(jù)結(jié)構(gòu)無(wú)論是List<T>
或是T[]都可以成功獲得數(shù)組數(shù)據(jù)。
復(fù)雜的對(duì)象
但是上面的方法有一個(gè)問(wèn)題,就是只能接收純數(shù)組數(shù)據(jù)。假設(shè)一個(gè)對(duì)象,比如用戶,該用戶下的屬性除了包含name(名稱),age(年齡)之外,還有一個(gè)聯(lián)系方式屬性contacts(List<String>)
,如何才能將既包含基本類型又包含數(shù)組類型的JSON數(shù)據(jù)直接封裝成對(duì)象呢?這里就需要標(biāo)簽@RequestBody
ajax代碼如下,需要注意的是,這里需要用JSON.stringfy()
方法將json數(shù)據(jù)轉(zhuǎn)化成字符流,添加至requestbody中。且在ajax方法中必須指明contentType和dataType屬性。
1
2
3
4
5
6
7
|
public class User{ private String name; private int age; private List<String> contacts; //或是 private String[] contacts; //getters and setters } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$.ajax({ var user = { 'name' : 'test' , 'age ' : 10, 'contacts' : [ '12313' , '123213123' ] } url : "someurl" , type : "POST" , dataType : "JSON" , contentType: "application/json" , data : JSON.stringify(user), success : function (data) { console.log(data) } }) |
java代碼如下
1
2
3
4
|
@RequestMapping ( "someurl" ) public @ResponseBody SomeData complicateObject( @RequestBody User user){ //方法詳情 } |
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。
原文鏈接:https://segmentfault.com/a/1190000009600375