struts源代碼閱讀(Commons-Validator)

作者:藍色憂鬱

email:[email protected]

版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
原文地址:
http://www.matrix.org.cn/resource/article/43/43759_Struts.html
關鍵字:Struts;Commons-Validator

Commons-Validator(一)

Commons-Validator包用來把驗證規則程序提取出來,以供重複使用。這個包可以使用在Struts中,也可以獨立的應用在任何其它的應用中。用戶可以通過java類的方式自定義驗證方法,也可以在配置文件中通過正則表達式配置驗證方法。它不但支持服務器端的驗證,客戶端的驗證也支持,具體需要使用tag把相應的js方法寫入相應的頁面中。

一、綜述:
整個Validator框架可以有若干個FormSet,而每個FormSet又可以有若干個Form,每個Form中可以有若干個Field。FormSet的process(...)方法,逐個調用其中的Form的process(...)方法,而Form的process(...)方法又是逐個調用Field的process(...)方法。Validator類作爲驗證的起始點,調用與其一一對應的Form的validate(...)方法,而Form的validate(...)方法又是逐個調用其中Field的validate(...)方法實現的。

二、配置文件說明:

<form-validation>
<global>
<constant>
<constant-name>驗證方法的標誌名</constant-name>
<constant-value>正則表達式</constant-value>
</constant>
<validator name="這個驗證方法的標誌名,供下面的depends調用"
classname="這個驗證方法在哪個類中,爲類全名"
method="驗證方法的名稱"
methodParams="這個驗證方法需要的參數類型,依次以逗號格開,爲類全名"
depends="基於什麼驗證之上,可以爲多個值,以逗號格開,值爲方法的標誌名"
jsFunction="js的方法全名,格式爲文件路徑.方法名。文件路徑以點隔開,
如果不填,默認爲org.apache.commons.validator.javascript.xxxx"
msg="對應於properties文件中的一條,作爲不通過驗證時返回的信息"/>
</global>
<formset language="語言" country="城市" variant="方言?">
<constant>
<constant-name>驗證方法的標誌名</constant-name>
<constant-value>正則表達式</constant-value>
</constant>
<form name="bean 對象名稱">
<field property="bean中的屬性名" depends="需要什麼樣的驗證,可以爲多個值,以逗號格開,值爲方法的標誌名">
<arg name = "變量名" key = "properties文件的key,或者來自Var的name" resource = "是/否來自資源文件"/>
<var>
<var-name>變量名</var-name>
<var-value>變量值</var-value>
</var>
</field>
</form>
</formset>
</form-validation>

Commons-Validator(二)

在Validator的配置文件中,一共有如下幾個基本元素。

一、org.apache.commons.validator.Var
它的作用是爲配置文件(validator.xml)中的其它標籤提供可取用的變量,爲Field提供執行驗證所需要的其它參數值,比如最大長度。這個類有如下屬性:name,變量的名稱;value,變量的值;jsType,當要自動生成js的時候,js的類型。

二、org.apache.commons.validator.Arg
它的作用是替換信息中的某一部分,或者爲驗證方法提供必需的參數值。這個類有如下屬性:bundle,資源文件名,用來存放所需要的信息。key,表示Arg的key或者value。name,表示Arg的名稱。position,這個Arg中的值用來替換信息中的哪一部分,需要替換的部分以{n}標誌。resource:key所指定的信息是否來自外部的資源文件,默認爲true;如果爲true,則代表key爲buddle屬性所指定的資源文件中的key。

三、org.apache.commons.validator.Msg
它的作用是在驗證不通過時,應該返回什麼的信息。這個類有如下屬性:bundle,資源文件名,用來存放所需要的信息。key,表示Msg的key或者value。name,表示Msg的名稱。resource:key所指定的信息是否來自外部的資源文件,默認爲true;如果爲true,則代表key爲buddle屬性所指定的資源文件中的key。

四、org.apache.commons.validator.FormSet
這個類管理通過一個Map所有要檢驗的Form對象,key爲Form的name;同時通過一個Map管理在<formset/>中定義的Constant,key爲<constant-name>。同時其內部有language,country, variant這幾個屬性,用來實現國際化。一個配置文件可以有多個FormSet,這些FormSet的區別是要求不同的本地化。

五、org.apache.commons.validator.Form
這個類有如下屬性:name,這個form的名稱。lFields,一個保存所有Field的List。hFields,一個保存所有Field的FastHashMap,這個FastHashMap的key值是對應Field的key屬性(對應配置文件中的property)。這個類通過validate(...)方法用來對這個Form中的所有位置低於page的Field進行驗證。它實際是在一個循環中逐個調用每個field的validate(...)方法,然後把結果保存在一個ValidatorResults對象中。

六、org.apache.commons.validator.Field
這個類有如下屬性:depends,依賴於什麼驗證規則。dependencyList保存了以逗號爲分隔符把depends分割生成的list。page,如果是多步提交的話當前是第幾步,值等於或小於表單中page性質的值,JavaBean 纔會得到處理;args,是一個數組;這個數組的元素爲HashMap,每個HashMap在數組的位置就是其中的Arg中的position屬性的值;HashMap中的key值爲Arg的name,如果這個name爲null則爲默認的值:DEFAULT_ARG(org.apache.commons.validator.Field.DEFAULT),value爲Arg對象。hVars,是一個FastHashMap,用來管理所有的Var對象,key爲Var的name,值爲Var對象。getIndexedListProperty表明這個property爲JavaBean中的一個數組元素的index。

1、process(Map globalConstants, Map constants)
這個方法用來執行配置文件中變量的替換。它的兩個參數分別爲在<global/>和<formset/>中定義的constant。在這個Map中,key爲<constant/>標籤中的constant-name,value爲<constant-value>。在配置文件中,可以實現如下的變量使用方式:Form的property屬性,Var中的value屬性,Arg中的key屬性,Msg的key屬性,他們均可以通過{constant-name}的方式,引用在<global/>或者<formset/>標籤中定義的constant。Arg中的key屬性,可以通過{Var:var-name}的方式引用在<var/>中定義的Var。

FormSet中的process(...)方法依次調用其中的Form的process(...)方法,而Form的process(...)方法又依次調用其中的Field的process(...)方法。

2、validate(Map params, Map actions)
執行驗證,其中actions保存了所有的ValidatorAction對象。它首先會從params取出key爲Validator.BEAN_PARAM(java.lang.Object)的值作爲要驗證的JavaBean。然後通過generateKey()方法判斷當前要驗證的Field是否是IndexedList。如果是,則需要分別對這個List中的各個元素進行驗證;否則直接執行對與JavaBean的特定屬性(property)執行驗證。

3、validateForRule(...)
接受要執行的ValidatorAction對象的同時,還是會接受Map actions參數,這是因爲這個要執行的ValidatorAction可能會依賴於其它的ValidatorAction。它會先查找以前的驗證結果,如果以前沒有執行過這個驗證,那麼執行runDependentValidators(...)方法,執行它所依賴於的ValidatorAction;如果通過,那麼再對要執行的ValidatorAction,執行驗證。

Commons-Validator(三)

在Validator包中提供了一些Util類,同時提供了對基本數據類型,時間,E-mail,信用卡等格式的驗證方法。

一、org.apache.commons.validator.util.Flags
這個類用來管理一系列的Flag,其中的每個Flag的值都是2的N次方。然後每個Flag之間位與(&)就得到了整個Flags的值。

二、org.apache.commons.validator.util.ValidatorUtils
這個類爲Validator提供一些Utility的操作,共有三個方法。

1、replace(...)
這個方法用來將一個字符串中某個特性的字符串替換爲另一個字符串,注意這是一個全局替換方法。

2、getValueAsString(...)
這個方法用來獲取某個Bean中的一個特定的屬性,然後把屬性值轉換爲字符串返回。注意,String[]和Collection類型的值,如果裏面不包含任何值,則直接返回""。

3、copyFastHashMap(...)
很顯然的是對一個特定的FashHashMap執行copy。這裏要注意的是,如果value爲Msg,Arg,Var類型的時候需要執行clone,然後再保存。

三、org.apache.commons.validator.ValidatorUtil
這個類完全通過調用上面的ValidatorUtils方法,實現自己的同名方法。只是多了一個getDelimitedRegExp(...)方法,用來生成一個正則表達式。

四、org.apache.commons.validator.DateValidator
實現了單例模式。這個類用來檢查日期類型是否合法,日期的類型要通過參數傳遞給這個Validator。同時還有一個strict屬性,表示時候檢查過渡匹配所要求的日期格式。這個日期檢查就是通過formatter.parse(value)方法檢查時候有異常拋出。

五、org.apache.commons.validator.EmailValidator
實現了單例模式。這個類用來檢查Email類型是否合法。它通過正則表達式實現驗證。

六、org.apache.commons.validator.GenericTypeValidator
這個類實現了對基本類型(Byte,Short,Int,Long,Float, Date)的檢測,方法很簡單,就是通過每個類型的構造函數創建相應的對象,如果拋出異常就說明不符合,否則符合。同時,這個類還提供對CreditCard驗證的實現。

Commons-Validator(四)

通過調用Validator的validate(...)方法,啓動驗證。

一、org.apache.commons.validator.Validator
這個類是對一個Form執行驗證的起點,通過調用這個類的validate(...)方法,啓動驗證。這個類中的formName屬性,對應於Form中的name屬性。resources屬性,記錄這個Validator屬於哪一個ValidatorResources。parameters用來管理執行validateXXX(...)方法時所需要的參數,它是一個Map,key爲類全名,value爲這個類全名所指的類的一個對象。注意,這個parameters是這個Form中所有Field所要執行的所有validateXXX(...)方法時所需要的參數集合。每個validateXXX(...)方法,根據自己需要的參數名(類全名),從這個parameters中查取自己所需要的參數。

二、org.apache.commons.validator.ValidatorAction
每個ValidatorAction對應於配置文件中的一個<validator/>。它有如下屬性:name,這個驗正動作的標誌名,用在depends屬性的配置中。classname,這個驗證方法在哪個類中,爲類全名。validationClass,由classname生成的Class。method,這個驗證方法的名稱。validationMethod,由method生成的Method。methodParams,執行這個驗證方法所需要的參數,值爲逗號隔開的類全名,默認值爲Validator.BEAN_PARAM,Validator.VALIDATOR_ACTION_PARAM,Validator.FIELD_PARAM。parameterClasses,由methodParams生成的Class數組。depends,依賴何ValidatorAction之上。msg,如果沒有通過此驗證,應該返回什麼消息。javascript,爲對應的javascript方法的代碼內容。jsFunction,爲對應的js文件名稱。jsFunctionName,對應的js中方法的名稱。

1、executeValidationMethod(...)
這個方法用對Field中的值進行檢測。它實際上就是通過反射,根據類名、方法名和參數類型執行相應的驗證方法。要注意的是,如果這個Field爲indexList類型的,則需要把Java Bean替換爲對應的Array中pos指定的元素。同時Field的key屬性中的[]要變爲[pos]。

2、這個類還提供了對js的基本操作,解釋如下:
*generateJsFunction()
用來生成名爲org.apache.commons.validator.javascript.validateXxxx的js文件名。其中Xxxx與name相對應。

*readJavascriptFile(...)
用來讀取js文件。由於一個js文件只包含一個方法,因此會讀取所有的內容後,直接返回所讀取的所有內容。

三、org.apache.commons.validator.ValidatorResults
這個類管理對一個Form中的所有Field執行驗證的結果。它有如下屬性:hResults,用來管理對所有Field驗證的結果,它的key爲field的kye屬性,它的value爲ValidatorResult對象。

四、org.apache.commons.validator.ValidatorResult
這個類用來管理對於一個Field執行驗證的時候,所有的驗證方法的結果。它有如下屬性:field,所要驗證的Field對象。hAction,用來保存所有驗證結果的Map,它的key爲ValidatorAction中的name屬性,value爲ResultStatus對象。

五、org.apache.commons.validator.ResultStatus
它封裝了對某個Field執行某個驗證後的結果。它有如下屬性:valid,表示是否通過驗證。result:爲執行驗證後的結果。

Commons-Validator(五)

最後,說明Validator是如何初始化的。

一、org.apache.commons.validator.ValidatorResourcesInitializer
這個類用來初始化Validator框架,通過Digester包解析用戶自定義的xml配置文件。然後把解析的結果保存到ValidatorResources對象中,最後返回這個ValidatorResources對象。

二、org.apache.commons.validator.ValidatorResources
這個類用來管理Validator框架中的資源。它包含如下屬性:hFormSets,一個FastHashMap,用來管理所有的FormSet,這個FastHashMap的key爲根據FormSet中的本地信息生成的。hConstants,一個FastHashMap,用來管理<global/>中定義的constant。hActions,一個FastHashMap,用來管理ValidatorAction,它的key爲ValidatorAction的name屬性。

三、與struts整合時需要增加的配置:
在struts-config.xml文件中加入:

<plug-in className="org.apache.struts.validator.ValidatorPlugIn"> <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /> </plug-in>
其中validator-rules.xml,爲Struts自帶的配置文件,配置了所有的驗證方法;而validation.xml爲用戶自己配置,配置要驗證的對象。

四、org.apache.struts.validator.FieldChecks
這個是Struts使用的核心驗證類,用來實現各種驗證規則。其中,validateXXX(...)就是想要創建的方法名,只要規則名沒有重複即可。validateXXX(...)方法的參數說明:
Object 驗證是在此JavaBean 對象上完成的
ValidatorAction 當前所執行的ValidatorAction
Field 被驗證的字段對象
ActionErrors 如果驗證失敗,新增ActionError 對象的錯誤對象
HttpServletRequest 當前的請求對象

五、org.apache.commons.validator.ValidatorResources
這個類用來通過Arg替換Msg中格式爲{N}的字符串

六、org.apache.commons.validator.ValidatorPlugIn
這個類用來初始化Validator,然後把初始化生成的ValidatorResources對象保存到ServletContext中,key爲VALIDATOR_KEY + config.getPrefix()。

七、org.apache.struts.validator.Resources
這個類用來初始化一個Validator對象,它首先通過key值VALIDATOR_KEY + config.getPrefix()從ServletContext取得相應的ValidatorResources對象。它再以這個對象爲參數構造一個Validator對象,然後把驗證方法需要的參數保存到Validator對象的parameters屬性中  
發佈了4 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章