需求
在商品信息修改提交時(shí)對(duì)商品信息內(nèi)容進(jìn)行校驗(yàn),例如商品名稱必須輸入膊存,價(jià)格合法性校驗(yàn)诚隙。
加入jar包
配置validator
<!-- 校驗(yàn)器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校驗(yàn)器-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 指定校驗(yàn)使用的資源文件厨埋,如果不指定則默認(rèn)使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- 校驗(yàn)錯(cuò)誤信息配置文件 -->
<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" />
<!-- 對(duì)資源文件內(nèi)容緩存時(shí)間撤缴,單位秒 -->
<property name="cacheSeconds" value="120" />
</bean>
將validator加到處理器適配器
配置方式
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>```
添加驗(yàn)證規(guī)則
public class Items {
private Integer id;
@Size(min=1,max=30,message="{item.name.length.error}")
private String name;
@NotEmpty(message="{pic.is.null}")
private String pic;```
錯(cuò)誤消息文件
CustomValidationMessages.properties
item.name.length.error=商品名稱在1到30個(gè)字符之間
pic.is.null=請(qǐng)上傳圖片```
controller
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,@ModelAttribute("items")
@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult,
MultipartFile items_pic) throws Exception{
//輸出錯(cuò)誤信息
if(bindingResult.hasErrors()){
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError:allErrors){
String atrError = new String(objectError.getDefaultMessage().getBytes("ISO-8859-1"),"UTF-8");
}
model.addAttribute("allErrors",allErrors);
return "items/editItems";
}
```
頁面
<!-- 顯示錯(cuò)誤信息 -->
<c:if test="${allErrors!=null}">
<c:forEach items="${allErrors }" var="error">
${error.defaultMessage}</br>
</c:forEach>
</c:if>```
分組校驗(yàn)
如果兩處校驗(yàn)使用同一個(gè)Items類則可以設(shè)定校驗(yàn)分組,通過分組校驗(yàn)可以對(duì)每處的校驗(yàn)個(gè)性化令蛉。
需求:商品修改提交只校驗(yàn)商品名稱長度
定義分組:
分組就是一個(gè)標(biāo)識(shí)聚霜,這里定義一個(gè)接口:
public interface ValidGroup1 {
}
public interface ValidGroup2 {
}```
指定分組校驗(yàn):
public class Items {
private Integer id;
//這里指定分組ValidGroup1,此@Size校驗(yàn)只適用ValidGroup1校驗(yàn)
@Size(min=1,max=30,message="{item.name.length.error}",groups={ValidGroup1.class})
private String name;```
// 商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(@Validated(value={ValidGroup1.class}) @ModelAttribute("item") Items items,BindingResult result,
@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)
throws Exception {
//在@Validated中添加value={ValidGroup1.class}表示商品修改使用了ValidGroup1分組校驗(yàn)規(guī)則珠叔,也可以指定多個(gè)分組中間用逗號(hào)分隔蝎宇,
//@Validated(value={ValidGroup1.class,ValidGroup2.class })```
校驗(yàn)注解
@Null 被注釋的元素必須為 null
@NotNull 被注釋的元素必須不為 null
@AssertTrue 被注釋的元素必須為 true
@AssertFalse 被注釋的元素必須為 false
@Min(value) 被注釋的元素必須是一個(gè)數(shù)字祷安,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個(gè)數(shù)字姥芥,其值必須小于等于指定的最大值
@DecimalMin(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字汇鞭,其值必須小于等于指定的最大值
@Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內(nèi)
@Digits (integer, fraction) 被注釋的元素必須是一個(gè)數(shù)字凉唐,其值必須在可接受的范圍內(nèi)
@Past 被注釋的元素必須是一個(gè)過去的日期
@Future 被注釋的元素必須是一個(gè)將來的日期
@Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達(dá)式
Hibernate Validator 附加的 constraint
@NotBlank(message =) 驗(yàn)證字符串非null,且長度必須大于0
@Email 被注釋的元素必須是電子郵箱地址
@Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)
@NotEmpty 被注釋的字符串的必須非空
@Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)