數據驗證
數據驗證不應該被限定在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