springmvc后台接前端的參數,數組,集合,復雜對象等
參考地址:https://blog.csdn.net/feicongcong/article/details/54705933
POST方法時Java后端使用@RequestBody注解接收參數
$.ajax{
url:"xxxx",
type : 'POST',
dataType:"json",
contentType:"application/json",
data: JSON.stringify(["123", "456"]),
......
}
后台
@RequestMapping("/getEventData")public void getEventData(@RequestBody List<String> areaList) {
// TODO
}
@ResponseBody @RequestMapping(value = "/ajaxsortPriority") public ResultDo ajaxsortPriority(@RequestParam("ids[]") Long[] ids) { ResultDo resultDo=new ResultDo(); int size=cmsBannerService.sortPriority(ids); if(size==ids.length){ resultDo.setSuccess(true); }else{ resultDo.setSuccess(false); } return resultDo; }
前端
var param=[]; $("#tb_order").find("td[name='id']").each(function(){ param.push($(this).text()); }) var ids={ids:param}; $.ajax({ cache: true, type: "GET", url: "/cmsBanner/ajaxsortPriority", dataType:"json", data:ids, async: false, success: function (data) {
(2)集合
后台
@RequestMapping(value = "/cfgRepayRemind", method = RequestMethod.POST) @ResponseBody public ResultDo<?> cfgRepayRemind( @RequestBody List<SysDictPojo> sysDictPojos //@RequestBody 前台請求的數據格式必須為json ) { ResultDo<?> resultDo = ResultDo.build(); try { icProjectRepayService.cfgRepayRemind(sysDictPojos); } catch (Exception e) { resultDo.setSuccess(false); } return resultDo; }
//pojo類
public class SysDictPojo extends AbstractBasePojo { private Long id; private String key; private String value; private String description; }
前端
function cfgRepayRemind(ele) { var url = $(ele).attr("value"); var params = []; $("#repayRemindMobile").find("ul").each(function () { var id = $(this).find("input[name='id']").eq(0).val(); var value = $(this).find("input[name='value']").eq(0).val(); params.push({id: id, value: value});//id,value 為java bean里的屬性,名字一致 }) $.ajax({ cache: true, type: "POST", url: url, data: JSON.stringify(params),// 指定請求的數據格式為json,實際上傳的是json字符串 contentType: 'application/json;charset=utf-8',//指定請求的數據格式為json,這樣后台才能用@RequestBody 接受java bean dataType: "json", async: false, success: function (data) { if (data.success) { toastr.success("操作成功"); setTimeout(function () { location.reload(); }, 1000) } } }); }
(3) 單參數
前端
$.ajax({ type:"post", data:{total:'100'}, dataType:'json', url:"http://127.0.0.1:8089/icProject/test", success:function () { } })
后台
@RequestMapping(value = "/test", method = RequestMethod.POST) @ResponseBody public String test(@RequestParam("total") String total ) { return null; }
(3)傳多個參數
前端
var tagIds = [] $.ajax({ type: "POST", url: "/auth/childComment/createComment", data: { id: $("#sourceId").val(), courseId: $("#courseId").val(), classId: $("#commentClassId").val(), content: $("#updateContent").val(), childId: $("#childId").val(), classCatalogId: $("#classCatalogId").val(), tagId: tagIds },
后台
@PostMapping("createComment") @PreAuthorize("hasAnyAuthority('merchant:childComment:index')") @ResponseBody public ResultDo createComment( @RequestParam(value = "childId") Long childId, @RequestParam(value = "courseId") Long courseId, @RequestParam(value = "classId") Long classId, @RequestParam(value = "classScheduleId") Long classScheduleId, @RequestParam(value = "content") String content, @RequestParam(value = "tagId[]", required = false) List<Long> tagIds ) {
(4)表單數據序列化傳參,ajax提交
前端
var params = $("#sysUserFrm").serialize(); var url = "/sysUser/settingSave" $.ajax({ cache: true, type: "POST", url: url, data: params, dataType: "json", async: false, success: function (data) {} })
后台
@RequestMapping(value = "/settingSave", method = RequestMethod.POST) @ResponseBody public ResultDo<?> settingSave(SysUserPojo sysUserPojo) {}
這樣sysUserPojo也能接收到Bean,其實這里的$("#sysUserFrm").serialize() 就相當於組裝的 json對象 { }
使用時必須先組裝json對象{username:"carter" }
我的習慣是用 @RequestBody接受帶List對象的對象或者List對象,因為js中有個push方法用來組合得到 List 比較簡單
不使用contentType: “application/json”則data可以是對象,使用contentType: “application/json”則data只能是json字符串
使用@RequestBody(實際上接受的是json的字符串)
function logined() { $.ajax({ type: "POST", url: "/backend/logined", data:JSON.stringify({userName:"cater",password:"123456"}) ,//轉成字符串 contentType: "application/json;charset=utf-8",//不使用contentType: “application/json”則data可以是對象,使用contentType: “application/json”則data只能是json字符串 success: function (data) {} }) }
@RequestMapping(value = "adds",method = RequestMethod.POST,produces="text/html;charset=UTF-8") @ResponseBody public SimpleResult adds(HttpServletRequest request, HttpServletResponse response){ SimpleResult simpleResult=null; String str = null; try { //解碼,為了解決中文亂碼 str = URLDecoder.decode(request.getParameter("model"),"UTF-8"); System.out.println("----------------str"+str); JSONObject jb=new JSONObject(); //將json格式的字符串轉換為json數組對象 JSONArray array=(JSONArray)jb.fromObject(str).get("dts"); //取得json數組中的第一個對象 JSONObject o = (JSONObject) array.get(0);//獲得第一個array結果 System.out.println("數組大小:"+array.size()); //取出json數組中第一個對象的“userName”屬性值 String name=o.get("drunam").toString();//獲得屬性值 System.out.println(name); System.out.println(o); } catch (Exception e) { e.printStackTrace(); } simpleResult=SimpleResult.success(); return simpleResult; }
在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,這時服務器就不知道怎么解析數據了,所以才只能通過獲取原始數據流的方式來進行解析請求數據。
第一種方式 傳遞的參數Bean
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格式的字符串)
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) ; }