通过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>>更复杂对象

同理


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

转:Java中String与byte[]的转换