springMVC中validation校驗案例
validation校驗相比於大部分前臺js校驗更加簡單,因爲在後臺進行校驗,安全性較高
1、導入支持的jar包
2、配置springMVC.xml
(1)不使用映射器和適配器的情況下
<!-- 可以替代映射器和適配器 -->
<mvc:annotation-driven validator="validator"/>
<!-- 校驗器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 注入Hibernate校驗器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校驗所使用的資源文件,如果不指定默認使用classes下面的 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校驗錯誤信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 資源文件名 -->
<property name="basenames">
<list>
<value>
classpath:CustomValidationMessages
</value>
</list>
</property>
<!-- 資源文件的編碼格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 對資源文件緩衝時間 -->
<property name="cacheSeconds" value="120"/>
</bean>
(2)使用映射器和適配器的情況
<!-- 註解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 註解適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<!-- 引用自定義屬性編輯器 -->
<property name="webBindingInitializer" ref="customBinder"/>
</bean>
<!-- 自定義的屬性編輯器 -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator"/>
</bean>
<!-- 校驗器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 注入Hibernate校驗器 -->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校驗所使用的資源文件,如果不指定默認使用classes下面的 -->
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校驗錯誤信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 資源文件名 -->
<property name="basenames">
<list>
<value>
classpath:CustomValidationMessages
</value>
</list>
</property>
<!-- 資源文件的編碼格式 -->
<property name="fileEncodings" value="utf-8"/>
<!-- 對資源文件緩衝時間 -->
<property name="cacheSeconds" value="120"/>
</bean>
3、創建CustomValidationMessages.properties
4、校驗規則
在實體類中加入註解
public class User {
private Integer uid;
// 商品名稱長度限制在1-30之間
@Size(min = 1, max = 30, message = "{user.name.length.error}")
private String username;
@Size(min = 1, max = 30, message = "{user.password.length.error}")
private String password;
private String context;
// 創建時間不能爲空
// 通過groups制定該校驗屬於哪個分組,可以制定多個分組
@NotNull(message = "{user.createtime.is.notnull}", groups = { ValidGroup1.class })
private Date createtime;
5、捕獲異常的方法
@RequestMapping("inserUser")
// 每個需要校驗的pojo前面都需要加Validdated,後面都加BindingResult bindingResult
public String insertUser(@Validated User user, BindingResult bindingResult,
Model model) {
// 如果校驗中存在錯誤
if (bindingResult.hasErrors()) {
List<ObjectError> errors = bindingResult.getAllErrors();
// 將錯誤信息放入ModelAndView中
model.addAttribute("errors", errors);
for (ObjectError objectError : errors) {
// 輸出錯誤信息到控制檯
System.out.println(objectError.getDefaultMessage());
}
// 跳轉回添加頁面
return "user/user_add";
}
6、在頁面簡單展示錯誤信息
<c:forEach items="${errors }" var="e">
${e.defaultMessage }
</c:forEach>
7、分組校驗
某些方法只想校驗部分屬性時使用
(1)創建分組接口
package com.yy.controller.validation;
/**
* 校驗分組:用於修改的校驗
*
* @author 楊揚 2017-3-21下午8:09:33
*/
public interface ValidGroup1 {
// 接口不定義方法,只定義標識哪些校驗規則屬於ValidGroup1
}
(2)通過groups在po類中確定分組
// 通過groups制定該校驗屬於哪個分組,可以制定多個分組
@NotNull(message = "{user.createtime.is.notnull}", groups = { ValidGroup1.class })
private Date createtime;
(3)在controller的方法中定義使用校驗的分組
// 在@ValidTed(value={}),在value中定義ValidGroup1分組的校驗
public String insertUser(
@Validated(value = { ValidGroup1.class }) User user,
BindingResult bindingResult, Model model) {