使用@Valid annatation的表單校驗html
須要引入的依賴 :java
javax.validation.validation-api-1.0.0.GA.jar 校驗標準接口web
hibernate-annotations-3.4.0.GA.jar,hibernate-validator-4.0.1.GA.jar hibernate提供的實現包spring
slf4j-api-1.5.0.jar,slf4j-nop-1.5.0.jar 日誌依賴包api
1.pojo Formapp
public class LeadsForm { /** * @see javax.validation.constraints.NotNull 使用標準中的註釋類 */ @NotNull @Size() private String contactName; @NotNull @Pattern(regexp = "^1\\d{10}$") private String contactTel; //~~GETTERS && SETTERS }
2.controllerpost
/** * Renhenet.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ package com.renhenet.web; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import sample.LeadsForm; /** * * @author xiaoxia.dong * @version $Id: PostController.java,v 1.1 2012/08/10 14:38:11 dongxx Exp $ */ @Controller @RequestMapping("/post.html") public class PostController { @ModelAttribute("leadsForm") public void modelAttribute(LeadsForm leadsForm) { } //使用 @Valid @RequestMapping(method = RequestMethod.POST) public String processSubmit(@Valid LeadsForm leadsForm, BindingResult result, ModelMap map) { if (result.hasErrors()) { } return "post"; } }
使用@Valid annatation 就不用在xml文件中配置 validator。其實使用了接口org.springframework.validation.Validator,默認實現類org.springframework.validation.beanvalidation.LocalValidatorFactoryBeanui
3.使用velocity模板,創建macro。spring的RequestContext能夠經過$springMacroRequestContext變量在velocity中使用。this
另外error.code恰好是@NotNull @Pattern等的類名spa
#macro( getErrorCode $objectName $field) #set($errors = $springMacroRequestContext.getErrors($objectName))#if($errors && $errors.fieldErrors && $errors.fieldErrors.size()>0)#foreach($e in $errors.fieldErrors)#if("$!field"=="$e.field")$e.code#end#end#end #end #macro( Pattern $objectName $field $message) #if("#getErrorCode($objectName,$field)"=="Pattern") $!message #end #end #macro( NotNull $objectName $field $message) #if("#getErrorCode($objectName,$field)"=="NotNull") $!message #end #end #macro( Size $objectName $field $message) #if("#getErrorCode($objectName,$field)"=="Size") $!message #end #end
模板頁面這樣使用
<form class="form-horizontal" method="post"> <fieldset> <legend>快速報名</legend> <div class="control-group"> <label class="control-label" for="input01">姓名</label> <div class="controls"> <input type="text" class="input-xlarge" name="contactName" value="$!leadsForm.contactName"> <p class="help-block">字母,數字,漢字皆可 #getErrorCode("leadsForm","contactName")</p> </div> </div> <div class="control-group"> <label class="control-label" for="input01">手機號碼</label> <div class="controls"> <input type="text" class="input-xlarge" name="contactTel"> <p class="help-block">#Pattern("leadsForm","contactTel","手機號碼的格式不正確")</p> </div> </div> <div class="control-group"> <label class="control-label" for="input01">地址</label> <div class="controls"> <select name="contactRegion" id="user_region" onchange='select_region("user_hot","H",this.value)' class="span2"> <option value="">-請選擇-</option> </select> #NotNull("leadsForm","contactRegion","請選擇地區") <select name="contactRegionHot" id="user_hot" class="span2"> <option value="">-請選擇-</option> </select> <input type="text" class="input-xlarge" name="contactAddress"> #Size("leadsForm","contactAddress","請輸入詳細地址") </div> </div> </fieldset> <input type="submit" value="報名"> </form>