数据验证
数据验证不应该被限定在Web层处理
Validator接口:
Spring提供Validator接口来进行对对象的验证
supports(Class)
判断validator是否能校验提供的class实例
validate(Obeject,org.springframework.validation.Errors)
校验给定的对象,有校验失败信息放入Errors对象
底层实现
@Component
public class UserValidator implements Validator {
//验证的是否为同一类型
@Override
public boolean supports(Class> arg0) {
return User.class.equals(arg0);
}
//将验证错误信息存在Errors集合里
//ValidationUtils 工具类
@Override
public void validate(Object arg0, Errors arg1) {
//验证是否为空
ValidationUtils.rejectIfEmpty(arg1, "id", "id can't be null", "id不能为空");
User u=(User)arg0;
ValidationUtils.rejectIfEmpty(arg1, "name", "name.empty", "用户名不能为空");
//验证日期
if(u.getBirthday().getTime()>new Date().getTime()){
arg1.rejectValue("birthday", "birthday.wrong", "出生日期不能晚于当前时间");
}
}
}
框架使用
SpringMVC还支持声明式验证@Controller输入
SpringEL
介绍
Spring表达式语言(简称SpEL)是一个支持查询和操作运行时对象导航图功能的强大的表达式语言
不直接依赖于Spring,可独立使用
底层实现:接口ExpressionParser负责解析表达式字符串
EL配置元数据
#{}
xml文件使用
java注解使用
@Component("computer")
public class Computer {
//@Value("#{引用的名字.属性}")
@Value("#{memory.memoryNum }")
private int memoryNum;
//@Value("#{引用的Bean的@Component("name")的name}")
@Value("#{memory }")
private Memory memory;
public int getMemoryNum() {
return memoryNum;
}
public void setMemoryNum(int memoryNum) {
this.memoryNum = memoryNum;
}
public Memory getMemory() {
return memory;
}
public void setMemory(Memory memory) {
this.memory = memory;
}
}
EL可以使用的场景
方法
EL可以调用一个对象的属性、方法,并将返回值注入给另一个对象的属性
@Value("#{'tea'.toUpperCase()}")
参数只能传常量,不能是变量
构造
EL可以调用new关键字,实现构造方法调用,实例化出对象
@Value("#{new int[]{1,2,3}}")
@Value("#{new 包名.类名()}")
操作符
EL支持大多数的算数运算符,@Value("#{3+4}")
关系运算符 @Value("#{1^1}")
逻辑运算符 @Value("#{5>3}")
三元运算符 @Value("#{1> 2? 0:1}")
集合
支持List @Value("#{A.list}")
Properties
Map @Value("#{A.map['1']}")
集合的选择
.?[] 设置筛选条件
@Value("#{A.list.?[li>1]}")
@Value("#{A.map.?[key=='1']}")
.^[] 获取第一个匹配项
.$[] 获取最后一个匹配项
集合的投影
.![] 选择特定属性
@Value("#{A.students.![name]}")
选择和投影可以结合使用