struts2註解方式的驗證
struts2的驗證分為分編程式驗證、聲明式驗證、註解式驗證。因現在的人越來越懶,都追求零配置,所以本文介紹下註解式驗證。
一.hello world
參考javaeye的這篇文章,按著做一次,起碼有個初步印象
http://www.javaeye.com/wiki/taojintianxiastruts2/1650-17-7-note-the-use-of-struts2-validation
Validation使用名字叫做validator的Intercepter,在默認情況下,struts2已經定義了這個Intercepter,我們在不加聲明的情況下就可以使用Validation了
如果是使用默認的攔截器,就已經開啟了驗證框架的了,直接用。
開啟驗證的方式是(官網):
打開驗證
默認攔截器堆棧“defaultStack”已經打開驗證。在創建自己的攔截器堆棧一定要包括兩對validation
和workflow
攔截器。來自struts-default.xml
:
<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
攔截器提供了擴展。
<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 |
用來對一個屬性或類組合使用多種驗證 |
struts2註解方式的驗證