传递形式:

  • a标签的url
  • 表单传递
  • ajax类型传递

传递类型:

  • 字符串
  • 对象
  • 数组
  • json
  • xml

参数传递:

  1. a标签url请求传递往往是地址+参数(字符串、对象等)的形式,比如
    传递方法是get;此形式传递往往以基本数据类型进行传递。
  2. 表单请求传递,通常是以action为地址进行传递,传递方法采用post,其中有二进制数据如上传文件,需要更改属性enctype=“multipart/form-data”;此形式传递主要以基本数据类型或对象进行传递。
  3. ajax请求传递,主要以ajax所特有的形式进行传递,通常传递方法根据要求选择post或者get,穿的数据类型MINI都可以,相应参数也要进行设置。

controller接收数据往往是通过注解进行反射接收,所有不同形式不同类型的数据一定要采用正确的注解。
一、url和表单传参相对常规,主要用的注解就是@RequestParam,@ModelAttribute,@PathVariable

@RequestMapping(value=“对应请求的url”,method=RequestMethod.(大写GET/POST/PUT/DELET等)–不写代表支持所有方式的请求)

@RequestParam(value=""),意义是:将制定的请求参数赋值给方法中的形参,主要绑定接收url非对象参数或者是对象中各个具体字段参数(如方法中形参列表中列出对象中的某几个)。

@PathVariable 方便的获得请求url中的动态参数,但是仅仅支持一个属性值(就是该注解只有value一个属性),类型为String。

@ModelAttribute 注解作用是将请求参数绑定到Model对象上,只支持一个属性value,类型为String,该注解作用可以理解为将请求参数设置到Model中,这样当返回一个界面后就可以从Model中取得相应的值。

@ModelAttribute(value="")注释返回具体类的方法,其中value的值用来指定model的属性名称,而形参注解用@RequestParam(value="")绑定请求参数,@model属性值往往是被注解方法的返回值。

@ModelAttribute注解Void返回值的方法,形参中需要Model来设置请求的信息,采用model.addAttribute("",value),不需要return语句,跳转后可以通过request作用域访问到相应数据。

@ModelAttribute注释返回具体类的方法,这里model属性没有被指定,被注解的方法返回类型隐含表示,如果备注解方法返回的是User类型,name这个model属性名称就是user。

@ModelAttribute和@RequestMapping一同使用时注解一个方法,此时返回值不是视图名,而是Model的属性值,视图名称是RequestMapping的value值。

@ModelAttribute注解一个方法的参数(非被注解的方法形参),主要作用可以理解为,在非被注解方法中修改Model的相关属性。也可以作为接收表单传递的pojo

最终在跳转后都能够通过request作用域访问到相应数据。

二、ajax参数传递

ajax传递参数主要有基本数据类型、基本对象类型(不含集合等)、特殊对象类型(含集合)、数组类型和json类型。经常用json的方式传递

要使用json,首先需要对应支持的js文件和jar包,

json2.js放入相应工程中,并且在jsp页面引入路径

jackson-core

jackson-databind

ajax传递参数及接收很多童鞋已经总结的挺到位,以下借鉴一下直接拿来,以免不好找.

参考1、

这里有@ResponseBody和@RequestBody 是很好很重要的两个注解

@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON。
@RequestBody 注解前台只需要向 Controller 提交一段符合格式的 JSON,Spring 会自动将其拼装成 bean。
Spring这个转换是靠org.codehaus.jackson这个组件来实现的,所有需要引入jackson-core-asl和org.codehaus.jackson两个jar包

通过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)
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

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());
        }
    }