SpringMVC---参数绑定
最近项目中用到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表单了吗?是不是很容易理解...