在SpringMVC環境中,@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象。然而在ajax請求每每傳的都是Json對象,用 JSON.stringify(data)的方式就能將對象變成字符串。同時ajax請求的時候也要指定dataType: "json",contentType:"application/json" 這樣就能夠輕易的將一個對象或者List傳到Java端!
服務器爲何會對錶單提交和文件上傳作特殊處理,由於表單提交數據是名值對的方式,且Content-Type爲application/x-www-form-urlencoded,而文件上傳服務器須要特殊處理,普通的post請求(Content-Type不是application/x-www-form-urlencoded)數據格式不固定,不必定是名值對的方式,因此服務器沒法知道具體的處理方式,因此只能經過獲取原始數據流的方式來進行解析。 jquery在執行post請求時,會設置Content-Type爲application/x-www-form-urlencoded,因此服務器可以正確解析,而使用原生ajax請求時,若是不顯示的設置Content-Type,那麼默認是text/plain,這時服務器就不知道怎麼解析數據了,因此才只能經過獲取原始數據流的方式來進行解析請求數據。
jsp文件: $("#saveuddd").click(function(){ var saveDataAry=[]; var data1={"name":"test","password":"gz"}; var data2={"name":"ququ","password":"gr"}; saveDataAry.push(data1); saveDataAry.push(data2); $.ajax({ type:"POST", url: basePath + "/user/saveUser", dataType:"json", contentType:"application/json", // 指定這個協議很重要 data:JSON.stringify(saveDataAry), //只有這一個參數,json格式,後臺解析爲實體,後臺能夠直接用 success:function(data){ } }); }) java文件 @RequestMapping(value = "saveUser", method = {RequestMethod.POST }) @ResponseBody public void saveu( @RequestBody List<User> users ){ //此時的user是map數據,並無解析爲bean // 不建議使用 System.out.println(users) ; } 使用以下方法,可使用bean @RequestMapping(value = "saveUser", method = {RequestMethod.POST }) @ResponseBody public void saveu( @RequestBody User[] users ){ System.out.println(users.getName()) ; // 此時的user是實體bean }
jsp同上 另一種: @RequestMapping(value = "saveUser", method = {RequestMethod.POST }) @ResponseBody public void saveu( @RequestBody List<Map<String,String>> users ){ // spring MVC只能解析外層的json格式,內部的bean轉化爲Map格式的鍵值對,須要對map解析 List<User> userList = new ArrayList<User>(); for(Map<String,String> map : users){ User u = new User(); u.setName(map.get("name")); u.setPassword(map.get("password")); userList.add(u); } // 這裏就可使用 userList 了 }
可以傳遞多個參數,可是每個參數都是字符串(bean類型的數據會轉化爲JSON格式的字符串)java
jsp文件 $("#saveuddd").click(function(){ var saveDataAry=[]; var data1={"name":"test","password":"gz"}; var data2={"name":"ququ","password":"gr"}; saveDataAry.push(data1); saveDataAry.push(data2); $.ajax({ type:"POST", url: basePath + "/user/saveUser", dataType:"json", data:{users:JSON.stringify(saveDataAry),aa:"ddd"}, // 能夠傳遞多個參數,但此時的users內容與另一個參數:aa 的內容一塊兒傳遞,因此後臺解析爲字符串 // 後臺接收的users內容:[{"name":"test","password":"gz"},{"name":"ququ","password":"gr"}] // 後臺接收的 aa 內容:"ddd" success:function(data){ } }); }) java文件 @RequestMapping(value = "saveUser", method = {RequestMethod.POST }) @ResponseBody public void saveu( String users , String aa ){ System.out.println(users) ; }