Spring框架——SpringEL

数据验证

数据验证不应该被限定在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}")
  • 集合

    • 支持List @Value("#{A.list}")
    • Properties
    • Map @Value("#{A.map['1']}")
    • 集合的选择
      • .?[] 设置筛选条件
        • @Value("#{A.list.?[li>1]}")
        • @Value("#{A.map.?[key=='1']}")
      • .^[] 获取第一个匹配项
      • .$[] 获取最后一个匹配项 
    • 集合的投影
      • .![] 选择特定属性
      • @Value("#{A.students.![name]}")
    • 选择和投影可以结合使用
原文地址:https://www.cnblogs.com/occlive/p/13558522.html