struts2的驗證分爲分編程式驗證、聲明式驗證、註解式驗證。因如今的人愈來愈懶,都追求零配置,因此本文介紹下註解式驗證。html
一.hello worldjava
參考javaeye的這篇文章,按着作一次,起碼有個初步印象正則表達式
http://www.javaeye.com/wiki/taojintianxiastruts2/1650-17-7-note-the-use-of-struts2-validationexpress
Validation使用名字叫作validator的Intercepter,在默認狀況下,struts2已經定義了這個Intercepter,咱們在不加聲明的狀況下就可使用Validation了apache
若是是使用默認的攔截器,就已經開啓了驗證框架的了,直接用。編程
開啓驗證的方式是(官網):框架
默認攔截器堆棧「defaultStack」已經打開驗證。在建立本身的攔截器堆棧必定要包括兩對validation
和workflow
攔截器。來自struts-default.xml
:ui
<interceptor-stack name="defaultStack"> ... <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> </interceptor-stack>
從版本2.0.4開始,Struts爲XWork的com.opensymphony.xwork2.validator.ValidationInterceptor
攔截器提供了擴展。this
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
這個攔截器容許咱們經過使用@org.apache.struts2.interceptor.validation.SkipValidation
action方法的註解來關閉特定方法的驗證。編碼
即自定義的攔截器棧須要加上上述標紅的部分,這樣才能開啓驗證,驗證纔會起做用
通常有兩種註解法
1.直接注在get方法上面,像這種
@RequiredStringValidator(message="Supply password")
public String getPassword() {
return password;
}
2.注在方法上面,like
@Validations(
requiredStrings={
@RequiredStringValidator(fieldName="username",message="用戶名不能爲空!"),
@RequiredStringValidator(fieldName="telNum",message="電話號碼不能爲空!")
},
regexFields={@RegexFieldValidator(fieldName="telNum",expression="^(\\+86|0|1)\\d{10,11}$",
message="電話號碼格式不正確!")}
)
@RequiredStringValidator表明進行字符串非空驗證,fildName是指須要驗證的參數名稱,message爲驗證失敗後顯示的信息。
但不管是哪一種註解,默認狀況下都是對這個action的全部方法進行驗證。
若是驗證不經過,將跳回result name 爲 「input」的視圖。錯誤信息是在 FieldError 裏, 固然咱們也能夠用@InputConfig(resultName=「xxx」),設置驗證不經過跳回的視圖.
@InputConfig(resultName=「xxx」)要配置在action類的方法上,用來更改當前方法若是驗證出錯的調回視圖,能夠更改默認的input,注意@InputConfig(resultName=「xxx」)只會對當前action配置的當前方法起做用,不管開不開啓方法級別的校驗都是隻對當前action配置的當前方法起做用。
顯示錯誤的方式:<s:fielderror fieldName="驗證的類的成員變量名"></s:fielderror> (
<s:fielderror /><!-- 不寫fieldName屬性顯示全部的fielderror錯誤 -->
)或者使用el來取值棧中的錯誤
@SkipValidation 若是某個方法不想驗證,那麼就能夠用這個標籤了
默認配置下,驗證框架是對全部方法都進行了驗證,其實咱們能夠對不須要驗證的方法上寫了@SkipValidation註解。。但這樣又出現了問題,如有兩個方法都須要進行驗證但參數又不相同,那怎麼辦呢?那就是開啓方法級別的驗證啦
注意:默認狀況下配置的@Validations是對當前action類中的全部方法起做用的,不論它具體是配置在哪一個方法上面
二.開啓方法級別的驗證
開啓方法級別的驗證只須要配置struts2的validation interceptor的一個參數validateAnnotatedMethodOnly爲true便可。 默認狀況下struts2的配置中沒有配置這個參數,因此須要咱們本身從新配置一下defaultStack:
<package name="yybean-default" extends="struts-default" abstract="true">
<interceptors>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"/>
</package>
其中重點就是
<!--開啓方法級別的驗證-->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
還有excludeMethods,這些方法都是不會執行驗證的。
開啓方法級別的驗證後,對於不須要進行驗證的方法不必使用@SkipValidation註解。
如今是當前方法只會使用當前方法上面配置的@Validations,不在是任何方法上配置的@Validations對全部方法都起做用了。
備註:
Annotation方式校驗: Struts2提供了註解的方式校驗
1) @Validation 指明這個類或者接口將使用基於註解的校驗。Struts2.1中已被標識爲過期。(即如今已經不須要加這個了)
2) @Validations() 在同一個方法上要使用多個註解校驗時。
3) @SkipValidation 指定某個方法不須要校驗。不然全部方法都會使用校驗。也能夠在檢驗攔截器中使用validateAnnotatedMethodOnly
舉例:
/** * 保存 * * @return * @throws Exception */ @Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名稱不容許爲空!"), @RequiredStringValidator(fieldName = "brand.code", message = "品牌惟一編碼不容許爲空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "網址格式錯誤!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不容許爲空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必須爲零或正整數!") }) @InputConfig(resultName = "error") public String save() throws Exception { Brand temp = brandService.getByField("code", brand.getCode()); if (temp != null) { this.addActionError("保存失敗!緣由:品牌代碼已存在!"); return ERROR; } temp = brandService.getByField("name", brand.getName()); if (temp != null) { this.addActionError("保存失敗!緣由:品牌名稱已存在!"); return ERROR; } if (logo != null) { // validateImageUploadRules(); String logImage = brandService.buildLogoImg(logo, logoContentType, logoFileName); brand.setLogo(logImage); } brand.setDeleted(false); brand.setDpTransFlag("N"); brandService.save(brand); redirectionUrl = "brand!list.action"; return SUCCESS; }
註解 |
相應的XML |
描述 |
RequiredFieldValidator |
required |
確保該屬性不是null |
RequiredStringValidator |
requiredstring |
確保一個String類型的屬性不是null,而且非空 |
StringLengthFieldValidator |
stringlength |
檢查String的長度範圍是否與所指望的一致 |
IntRangeFieldValidator |
int |
檢查int類型的數字是否超出所指望的大小範圍 |
DoubleRangeFieldValidator |
double |
檢查double類型的數字是否超出所指望的大小範圍 |
DateRangeFieldValidator |
date |
檢查date類型的屬性是否超出所指望的範圍 |
ExpressionValidator |
expression |
使用值棧來估算一個ONGL表達式(必需要返回boolean值) |
FieldExpressionValidator |
fieldexpression |
使用OGNL表達式來驗證字段 |
EmailValidator |
|
保證該屬性是一個有效的email地址 |
UrlValidator |
url |
保證該屬性是一個有效的URL |
ConversionErrorFieldValidator |
conversion |
檢查該屬性是否有轉換錯誤 |
RegexFieldValidator |
regex |
檢查該屬性的值是否與某個正則表達式相匹配。 |
VisitorFieldValidator |
visitor |
把對字段的驗證動做推遲到這個字段所屬的類的特有的另外一個驗證文件中執行。 |
StringRegexValidator |
n/a |
檢查字符串是否與正則表達式匹配 |
CustomValidator |
n/a |
表示使用了一個自定義的validator |
ValidationParameter |
n/a |
做爲CustomValidator 註解的一個參數 |
Validation |
n/a |
表示該類使用了基於註解的驗證——這個註解能夠與接口或類一塊兒使用 |
Validations |
n/a |
用來對一個屬性或類組合使用多種驗證 |
詳解:
舉例:@Validations(requiredStrings = { @RequiredStringValidator(fieldName = "brand.name", message = "品牌名稱不容許爲空!") }, urls = { @UrlValidator(fieldName = "brand.url", message = "網址格式錯誤!") }, requiredFields = { @RequiredFieldValidator(fieldName = "brand.displayOrder", message = "排序不容許爲空!") }, intRangeFields = { @IntRangeFieldValidator(fieldName = "brand.displayOrder", min = "0", message = "排序必須爲零或正整數!") })
舉例:
@Validations(intRangeFields =
{ @IntRangeFieldValidator(fieldName = "age", min = "6", max = "10", message = "age must be between ${min} and ${max}")}
)
@IntRangeFieldValidator:必須是整數並且範圍在min 和max之間,包括min和max
@RequiredStringValidator:確保一個String類型的屬性不是null,而且非空(非空即""),注意:若是都是提交的時候表單都是空格,也是空。
@UrlValidator:不起做用
@RequiredFieldValidator:確保該屬性不是null