最近项目中用到SpringMVC,它有一个很好的功能叫做参数绑定,也即与前端约定好一些特殊的规则,然后在后台写Controller方法的时候,可以不需要使用request.getparameter("key")之类笨拙的方法来取前端参数...,当然这个参数绑定的功能并不是SpringMVC独一无二的神器,Strust2也包含同样的功能,但是本文主要以SpringMVC为例。

正文

  为了便于说明该功能,我们首先创建一个Model,Stu表示学生类


1 public class Stu {
 2 
 3     private int number;//学号
 4     private String name;//姓名
 5 
 6     public int getNumber() {
 7         return number;
 8     }
 9 
10     public void setNumber(int number) {
11         this.number = number;
12     }
13 
14     public String getName() {
15         return name;
16     }
17 
18     public void setName(String name) {
19         this.name = name;
20     }
21 }



   随后我们再创建一个Controller类,用于与前端交互,大致如下,StuController



1 @Controller
2 public class StuController {
3 
4     @RequestMapping("/..")
5     public String method(Stu stu) {
6         return "../..";
7     }
8 }



  这里我们用一个stu对象来当做参数,只要和前端规定好某种约束规则,那么SpringMVC将会自动的帮我们进行参数绑定,也即会从request对象中取出参数,然后自动组装成stu对象传入method()方法中。这很大程度上简化了Controller的代码,使得项目的代码结构更加优雅...

  刚才一直提到某种特殊约定,那么究竟是什么特殊约定呢?接下来将为您揭晓...请看这段HTML



1 <form action="/..">
2     <input name="number" value="123"/>
3     <input name="name" value="csa" />
4     <input type="submit" value="Save" />
5 </form>



  其实只需要在form表单标签的nama与stu对象中的属性保持一致就可以,这样当前端传递参数的时候,会形类似于这样的数据 -- name="csa"&&number="123" -- 这样当springMVC拿到数据之后,会尝试调用setName()与setNumber)()方法,这样就很容易将参数包装成stu对象了~~

  上述表示的都是简单的数据类型,如果一个对象中包含一个数组,打个比方stu对象中还包含一个属性int[]  score,那这个成绩该如何传参呢?其实它也很简单...



1 <form action="/..">
2     <input name="number" value="123"/>
3     <input name="name" value="csa" />
4     <input name="score" value="69" />
5     <input name="score" value="70" />
6     <input name="score" value="71" />
7     <input type="submit" value="Save" />
8 </form>



   没错,你没有看错...就是将相同的标签名name都设置成score即可...这样在springMVC自动注入的时候,就会注入成一个int数组了,其实这个方法真心不优雅...利用Ajax会让这个功能变得更加完美



$.ajax({
    dataType: "json",
    url: '../..',
    type: 'POST',
    data: {
        number:"123",
        name:"csa",
        score:["69","70","71"]
    },
    traditional: true,
    success: function (data) {
        console.log("success");        
    },
    error: function () {
        console.log("error");  
    }
});



  利用Ajax就会很优雅的封装数组对象,然后springMVC会接受这个参数,然后封装成stu对象,被后台程序调用...还有,在写Ajax的时候,要加上traditional:true这句话,否则会报错的哦~具体原因请求助度娘。

  此时我们已经可以成功绑定基本数据类型和基本的数组类型了,那么该如何绑定复杂的引用类型呢?举个例子,假设stu对象中还有一个属性Teacher teacher,teacher里面就两个属性age与name吧,那要如何传递参数,让stu中的teacher也自动绑定呢?



1 <form action="/..">
 2     <input name="number" value="123"/>
 3     <input name="name" value="csa" />
 4     <input name="score" value="69" />
 5     <input name="score" value="70" />
 6     <input name="score" value="71" />
 7     <input name="teacher.age" value="24" />
 8     <input name="teacher.name" value="lqq" />
 9     <input type="submit" value="Save" />
10 </form>



  看到上面的form表单了吗?是不是很容易理解...