数据验证
数据验证不应该被限定在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文件使用
<!--静态注入-->
<bean id="Memory" class="com.xml.Memory">
<property name="memoryNum" value="1024"></property>
</bean>
<!--动态注入 #{id.name}-->
<bean id="Computer" class="com.xml.Computer">
<property name="memoryNum" value="#{Memory.memoryNum }"></property>
<property name="memory" ref="Memory"></property>
</bean>
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}")
- EL支持大多数的算数运算符,
-
集合
- 支持List
@Value("#{A.list}")
- Properties
- Map
@Value("#{A.map['1']}")
- 集合的选择
.?[]
设置筛选条件- @Value("#{A.list.?[li>1]}")
- @Value("#{A.map.?[key=='1']}")
.^[]
获取第一个匹配项.$[]
获取最后一个匹配项
- 集合的投影
.![]
选择特定属性@Value("#{A.students.![name]}")
- 选择和投影可以结合使用
- 支持List