Struts2: ActionSupport類中驗證(Validate)功能的實現(xiàn)

原文http://www.lifelaf.com/blog/?p=551
在Struts2中,action類通過實現(xiàn)特定的接口來配合使用攔截器是一種很常見的做法。ActionSupport類也是這樣,通過實現(xiàn)Validateable接口和ValidationAware接口來配合使用validation攔截器與workflow攔截器,從而實現(xiàn)驗證(Validate)功能:

public?class ActionSupport ?implements ? Action,

Validateable,ValidationAware,... {}

Validateable接口與validation攔截器

Validateable接口非常簡單,其中只有一個方法:/**

* Performs validation.

*/voidvalidate();

如果action聲明使用validation攔截器(只要Struts2 package繼承了struts-default,那么該package內(nèi)的action就都會使用validation攔截器),攔截器(ValidationInterceptor類)會調(diào)用action的validate()方法:

if(action instanceof Validateable) {? ?

Validateable validateable = (Validateable) action;? ?

validateable.validate();

}

不過,ActionSupport類對validate()方法的實現(xiàn)是空的,需要子類進(jìn)行覆寫并加入真正的驗證代碼:

/**

* A default implementation that validates nothing.

* Sub ?classes should override this method to provide validations.

*/publicvoidvalidate(){}

ValidationAware接口與workflow攔截器

ValidationAware接口定義了一系列存儲和讀取錯誤信息的方法:

void setActionErrors(Collection errorMessages);

Collection getActionErrors();voidsetActionMessages(Collection messages);

Collection getActionMessages();

void ? setFieldErrors(Map> errorMap);Map> getFieldErrors();

void ?addActionError(StringanErrorMessage);

void ?addActionMessage(StringaMessage);

void ? addFieldError(StringfieldName,StringerrorMessage);

boolean hasActionErrors();

boolean hasActionMessages();

boolean hasErrors();

boolean hasFieldErrors();

如果action聲明使用workflow攔截器(只要Struts2 package繼承了struts-default,那么該package內(nèi)的action就都會使用workflow攔截器),攔截器(DefaultWorkflowInterceptor類)會判斷action中是否含有錯誤,如果有的話,則讀取這些錯誤信息并顯示在頁面上:

if(action instanceof ValidationAware) {

ValidationAware validationAwareAction = (ValidationAware) action;? ?

if (validationAwareAction.hasErrors()){? ? ? ? ...? ? }}

在ActionSupport中,除了ValidationAware接口所定義的方法,ActionSupport還提供了一些用于清除已有錯誤信息的方法:

public ?void ?clearFieldErrors(){...}

public ?void ?clearActionErrors(){...}

public ?void ?clearMessages(){...}

public ?void ? clearErrors(){...}

public ?void ? clearErrorsAndMessages(){...}

而所有錯誤信息的存儲、讀取以及清除工作,ActionSupport都是通過調(diào)用ValidationAwareSupport類來實現(xiàn)的 — ValidationAwareSupport類內(nèi)部則定義了三個變量用于存儲這些信息:

private Collection actionErrors;

private Collection actionMessages;

private<Map> fieldErrors;

在action類中加入驗證代碼

從ActionSupport類處繼承的action類,可以通過覆寫父類的validate()方法來加入驗證代碼。而在validate()方法中,action類可以使用addFieldError或者addActionError等方法來存儲錯誤信息。這樣,當(dāng)validate攔截器起作用的時候,validate()方法被調(diào)用,錯誤信息被存儲;接著當(dāng)workflow攔截器起作用的時候,這些錯誤信息被讀取并顯示在頁面上:

從上面的描述中可以看到,validate攔截器需要在workflow攔截器之前起作用,否則workflow攔截器就無法讀取到錯誤信息。而這也正是struts-default包中默認(rèn)攔截器棧里的次序

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 標(biāo)簽 如果要配置的標(biāo)簽,那么必須要先配置標(biāo)簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,515評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 目錄 1. Struts2提供了三種數(shù)據(jù)封裝的方式 2. 封裝數(shù)據(jù)到Collection和Map 3. Strut...
    深海魚Q閱讀 1,024評論 3 10
  • 詳談 Struts2 的核心概念 本文將深入探討Struts2 的核心概念,首先介紹的是Struts2 的體系結(jié)構(gòu)...
    可愛傻妞是我的愛閱讀 1,225評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,688評論 18 399

友情鏈接更多精彩內(nèi)容