# 参数绑定
数据绑定是一个自动转换及赋值的过程,它负责将 HTTP 请求中的 String 类型的参数,转换为其他类型的请求处理方法的参数。
# 1. 绑定简单类型
当 HTTP 请求的参数名和处理方法参名一致时,SpringMVC 会将请求参数与形参进行绑定。
参数类型强烈建议使用 包装类 。
如果没有那么『凑巧』,HTTP 请求参数名和方法形参名不一致,可通过 @RequestParam 注解进行手动指定。
属性 | 作用 |
---|---|
value | 指定 request 中参数的名称。 |
required | 指定是否必须,是否必须,默认是 true。必须意味着为空时,报错退出。 |
defaultValue | 默认值,表示如果请求中没有同名参数时的默认值。 |
public String login1(
@RequestParam String username,
@RequestParam(value = "password", required = false, defaultValue = "N/A") String password) {
...
...
...
}
# 2. 绑定到 JavaBean
JavaBean 对象中的属性名和表单中 <input> 的 name 属性一致,并且 Controller 方法以 JavaBean 为形参即可。
<p><input name="name" placeholder="学生姓名" value="jerry"></p>
<p><input name="age" placeholder="学生年龄" value="19"></p>
<p>
<label><input type="radio" name="male" value="true" checked> 男</label>
<label><input type="radio" name="male" value="false">女</label>
</p>
<p><button type="submit">提交</button></p>
public class Student {
private String name;
private Integer age;
private Boolean male;
...
}
// 这里不需要 @RequestParam 注解
public String login(Student student) {
...
}
# 3. 绑定到复合 JavaBean
需要将表单中的数据绑定到一个对象中的某个对象属性上。例如:FormVO 对象下的 Student 属性。
这种情况下,需要页面 <input> 元素的 name 为 <属性名>.<属性名>
。
<p><input name="name" placeholder="老师姓名" value="tom"/></p>
<p><input name="age" placeholder="老师年龄" value="40"/></p>
<p><input name="student.name" placeholder="学生姓名" value="jerry"/></p>
<p><input name="student.age" placeholder="学生年龄" value="19"/></p>
<p><input type="submit" value="提交"/></p>
public class Student {
private String name;
private Integer age;
...
}
public class Teacher {
private String name;
private Integer age;
private Student student; /* name, age */
...
}
public String demo(Student student) {
...
}
# 4. 绑定到容器
# 5. @DateTimeFormat 和 @NumberFormat
有时会从前台向后台传入日期格式字符串,例如:
<p><input type="text" name="birthday" value="2000-10-1" placeholder="学生生日"></p>
一般情况下,不至于用到(后面所说的自定义类型转换),Spring MVC 提供了现成的 @DateTimeFormat 注解来解决 String 到 Date 的转换。
public Student {
...
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
...
}
另外,对于有特定格式的字符串,也有类似的注解:@NumberFormat 可用。
@NumberFormat("###,#####")
public double price;