1 validationhtml
Spring3支持JSR-303驗證框架,JSR-303 是JAVA EE 6 中的一項子規範,叫作Bean Validation,官方參考實現是Hibernate Validator(與Hibernate ORM 沒有關係),JSR 303 用於對Java Bean 中的字段的值進行驗證。java
1.1 配置validatorspring
<!-- 校驗錯誤信息配置文件 -->mvc
<bean id="messageSource"app
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">框架
<property name="basenames"> jsp
<list> ide
<value>classpath: CustomValidationMessages</value> ui
</list> this
</property>
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
</bean>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 若是不指定則默認使用classpath下的ValidationMessages.properties -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
<mvc:annotation-driven validator="validator"> </mvc:annotation-driven>
1.2 添加驗證規則
public class Items {
private Integer id;
@Size (min=1,max=30,message="{item.name.length.illigel}")
private String name;
@NotEmpty(message="{pic.is.null}")
private String pic;
1.3 錯誤消息文件 CustomValidationMessages
item.name.length.illigel=商品在名稱在1到3個字符之間
pic.is.null=請上傳圖片
1.4 捕獲錯誤
public String editItemSubmit(@Validated @ModelAttribute("item") Items items,BindingResult result,
@RequestParam("pictureFile") MultipartFile[] pictureFile,Model model)
throws Exception {
//若是存在校驗錯誤則轉到商品修改頁面
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
for(ObjectError objectError:errors){
System.out.println(objectError.getCode());
System.out.println(objectError.getDefaultMessage());
}
return "item/editItem";
}
注意:添加@Validated表示在對items參數綁定時進行校驗,校驗信息寫入BindingResult中,在要校驗的pojo後邊添加BingdingResult, 一個BindingResult對應一個pojo,且BingdingResult放在pojo的後邊。
頁頭:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
在須要顯示錯誤信息地方:
<spring:hasBindErrors name="item">
<c:forEach items="${errors.allErrors}" var="error">
${error.defaultMessage }<br/>
</c:forEach>
</spring:hasBindErrors>
說明:
<spring:hasBindErrors name="item">表示若是item參數綁定校驗錯誤下邊顯示錯誤信息。
1.5 分組校驗
若是兩處校驗使用同一個Items類則能夠設定校驗分組。
組就是一個標識,這裏定義一個接口:
public interface ValidGroup1 {
}
public interface ValidGroup2 {
}
指定分組校驗:
public class Items {
private Integer id;
//這裏指定分組ValidGroup1,此@Size校驗只適用ValidGroup1校驗
@Size(min=1,max=30,message="{item.name.length.illigel}",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分組校驗規則,也能夠指定多個分組中間用逗號分隔,
@Validated(value={ValidGroup1.class,ValidGroup2.class })
public class UserValidator implements Validator{
public static final String LOGIN = "login";
public static final String UPDATE_PASSWORD = "updatepassword";
private String type;
public UserValidator(String _type) {
this.type = _type;
}
@Override
public boolean supports(Class<?> arg0) {
return UserCommand.class.equals(arg0);
}
@Override
public void validate(Object target, Errors errors) {
UserCommand command = (UserCommand)target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required");
if(StringUtils.equals(type, LOGIN)){
//登錄校驗
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "field.required");
}else if(StringUtils.equals("type", UPDATE_PASSWORD)){
//修改密碼校驗
ValidationUtils.rejectIfEmpty(errors, "newPass", "field.required");
if(!errors.hasFieldErrors("newPassword")){
if(command.getNewPassword().equals(command.getPasswordAgain())){
errors.reject("passwordAgain", "user.passwordAgainb.error");
<spring:hasBindErrors name="user">
<c:if test="${errors.fieldErrorCount > 0}">
字段錯誤:<br/>
<c:forEach items="${errors.fieldErrors}" var="error">
<spring:message var="message" code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/>
${error.field}------${message}<br/>
</c:forEach>
</c:if>
<c:if test="${errors.globalErrorCount > 0}">
全局錯誤:<br/>
<c:forEach items="${errors.globalErrors}" var="error">
<spring:message var="message" code="${error.code}" arguments="${error.arguments}" text="${error.defaultMessage}"/>
<c:if test="${not empty message}">
${message}<br/>
</c:if>
</c:forEach>
</c:if>
</spring:hasBindErrors>
}
}
}
}
}