通過ajax傳遞引數給springmvc,經常會因為 引數型別太複雜,或者根本不知道springmvc都支援哪些型別轉換,導致後臺接收出現各種問題。如果書寫格式沒有問題仍然接受引數報錯,大部分是因為springmvc預設無法支援該種格式的json轉換導致的
現在一句話解決,就是用@RequestBody註解接收
下面看一些傳參的例子,基本涵蓋了大部分的引數傳遞型別
案例1:簡單陣列 idList[]
ajax
$("#test1").on("click",function(){ var idList = new Array(); idList.push("1"); idList.push("2"); idList.push("3"); $.post("/mvc/client1/test1",{idList:idList}) });
java
/** * 簡單型別list * explain:包含string int date 等屬性 */ @RequestMapping("/test1") @ResponseBody public void test1(@RequestParam("idList[]") List<Integer> idList){ for(Integer i: idList){ System.out.println(i); } }
案例1中要注意,當你ajax傳遞一個很簡單的陣列,本以為後臺能夠接受到,卻總是報錯,很可能的原因是:http請求傳遞陣列的時候,為了區別是一個陣列,會在陣列名稱後面加上中括號“[]”,所以後臺接受的時候用@RequestParam告訴方法,你要的idList實際上是idList[]就可以了
案例:2:簡單物件User (包含id,username)
ajax
$("#test2").on("click",function(){ var id =1; var username ="fangxin"; $.post("/mvc/client1/test2",{id:id,username:username,birthday:new Date()}) });
java
@RequestMapping("/test2") @ResponseBody public void test2(User user){ System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getBirthday()); }
這就是最常見的傳遞引數,如果一個物件的屬性都是簡單型別,那基本沒什麼問題
案例3:複雜物件User (包含id,username,String[],List<Person>)
ajax
$("#test3").on("click",function(){ var user = { id:1, username:"fangxin", birthday:new Date(), luckyNums:[1,2,3], friends:[ {name:"zhangsan"}, {name:"lisi"} ] }; $.ajax({ type: "POST", url:"/mvc/client1/test3", data: JSON.stringify(user), contentType:"application/json" }) });
java
/** * 複雜物件 * explain:包含簡單list屬性、物件list屬性 */ @RequestMapping("/test3") @ResponseBody public void test3(@RequestBody User user){ System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getBirthday()); for(Integer i:user.getLuckyNums()){ System.out.println(i); } for(Person p:user.getFriends()){ System.out.println(p.getName()); } }
案例3中的User的屬性相當複雜,有簡單陣列,還有包含物件的複雜List,這樣的user如果用案例2的方式接受,肯定就掛了。此時,最好是前臺stringify轉換成json字串,後臺用@RequestBody接受自動轉換成想要的資料格式。
案例4:複雜List<User>
ajax
$("#test5").on("click",function(){ var users = []; for(var i=0;i<10;i++){ var user = { id:1, username:"fangxin", birthday:new Date(), luckyNums:[1,2,3], friends:[ {name:"zhangsan"}, {name:"lisi"} ] }; users.push(user); } $.ajax({ type: "POST", url:"/mvc/client1/test5/", data: JSON.stringify(users), contentType:"application/json" }) });
java
/** * 複雜List */ @RequestMapping("/test5") @ResponseBody public void test5(@RequestBody List<User> users){ for(User user:users){ System.out.println(user.getUsername()); } }
用案例3的方式,依然可以接收到,屢試不爽。
案例5 List<Map<String,Obj>>更復雜物件
同理