springmvc后台接前端的參數,數組,集合,復雜對象等


springmvc后台接前端的參數,數組,集合,復雜對象等

參考地址:https://blog.csdn.net/feicongcong/article/details/54705933

 常用的幾種方式如下:
 
前端使用jquery向后台傳遞數組類型的參數,Java后台直接通過List類型接收,會發現無法取到參數。
如果后台非要用List接收參數的話,可以這樣實現:

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
}
 
(1)數組:
后台
@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) ;
    }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM