前言
记录学习过程
类型转换
使用@InitBinder注解进行类型转换
当提交表单时,controller会把表单元素注入到command类里,但是系统注入的只能是基本类型,如int,char,String。但当我们在command类里需要复杂类型,如Integer,date,或自己定义的类时,必须手动配置
SpringMVC默认不支持将表单中的日期字符串和实体类中的日期类型的属性自动转换,必须手动配置
使用@InitBinder注解和Spring自带的WebDataBinder类和操作实现类型转换
例:
(1)在实体类Users中添加属性regDate
private Date regDate;
//省略regDate的set和get方法
(2)在HelloController类中添加方法initBinder方法
需要细看WebDataBinder、@InitBinder
@InitBinder
//WebDataBinder实现将请求request绑定到复杂属性时的请求字符string到属性的转换
//一般的string, int, long会自动绑定到参数,但是自定义的格式spring就不知道如何绑定了
//所以要继承PropertyEditorSupport,实现自己的属性编辑器PropertyEditor,绑定到WebDataBinder ( binder.registerCustomEditor),覆盖方法setAsText,需要注解@InitBinder
public void initBinder(WebDataBinder binder){
// SimpleDateFormat 类来格式化时间
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-mm-dd");
binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat,true));
}
@InitBinder注解标识的方法可以对WebDataBinder对象进行初始化,用于完成从表单文本域到实体类属性的绑定
@InitBinder标识的方法不能有返回值
@InitBinder标识的方法参数为WebDataBinder,是DataBinder的子类,DataBinder是数据绑定的核心部分,可以用来数据类型转换、格式化以及数据校验
(3)HelloController控制器添加方法
@RequestMapping("/testInitBinder")
public String testInitBinder(Users users){
System.out.println(users.getRegDate());
return "success";
}
(4)index.jsp中添加表单
@RequestMapping("/testInitBinder")
public String testInitBinder(Users users){
System.out.println(users.getRegDate());
return "success";
}
(5)测试成功
输入:
小结:每次请求都会先调用@initBinder注解标识的方法,然后再调用控制器类中处理请求的方法
数据格式化
@initBinder注解除了可以实现数据类型的转换外,还可以通过在实体类的属性上添加相应的注解来实现数据的格式化
例:
(1)在Users实体类的regDate属性上标识@DataTimeFormat
@DateTimeFormat(pattern = "yyyy-mm-dd")
private Date regDate;
@DataTimeFormat可以将表单输入的yyyy-mm-dd格式的日期字符串格式化为Date类型的数据
(2)测试
将上面的@InitBinder注释的initBinder方法注释
输入:
依旧得到相同格式的日期数据:
控制器的数据校验
Spring3开始支持JSR-303验证框架
JSR-303支持xml风格的和注解风格的验证
例:
(1)导入包
我学习时下载的包,版本较低
(2)在users实体类中添加age和email属性,并添加set、get方法
,再添加常用注解
@NotEmpty
@Size(min = 6 , max = 20)
private String loginName;
private String loginPwd;
private Address address;
@DateTimeFormat(pattern = "yyyy-mm-dd")
private Date regDate;
@Email
@NotEmpty
private String email;
@Range(min = 18,max = 45)
@NotNull
private Integer age;
(3)在HelloController类中添加方法
@RequestMapping("/testValidate")
//@Valid注解告诉SpringMVC Users类的对象users在绑定表单数据后需要进行JSR-303验证
//绑定结果保存在BindingResult类的对象result中
//通过判断result就可以知道绑定过程是否发生错误
public String testValidate(@Valid Users users, BindingResult result){
if(result.getErrorCount()>0){
for (FieldError error:result.getFieldErrors()){
System.out.println(error.getField()+":"+error.getDefaultMessage());
}
}
return "success";
}
(4)在index.jsp中创建一个表单
<form action="/springmvc/testValidate" method="post">
loginName:<input type="text" name="loginName"><br>
email:<input type="text" name="email"><br>
age:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
(5)测试成功
将错误信息在控制台打印