原文地址:
http://www.matrix.org.cn/resource/article/43/43759_Struts.html關(guān)鍵字:Struts;Commons-Validator
Commons-Validator(一) Commons-Validator包用來(lái)把驗證規則程序提取出來(lái),以供重復使用。這個(gè)包可以使用在Struts中,也可以獨立的應用在任何其它的應用中。用戶(hù)可以通過(guò)java類(lèi)的方式自定義驗證方法,也可以在配置文件中通過(guò)正則表達式配置驗證方法。它不但支持服務(wù)器端的驗證,客戶(hù)端的驗證也支持,具體需要使用tag把相應的js方法寫(xiě)入相應的頁(yè)面中。
一、綜述: 整個(gè)Validator框架可以有若干個(gè)FormSet,而每個(gè)FormSet又可以有若干個(gè)Form,每個(gè)Form中可以有若干個(gè)Field。FormSet的process(...)方法,逐個(gè)調用其中的Form的process(...)方法,而Form的process(...)方法又是逐個(gè)調用Field的process(...)方法。Validator類(lèi)作為驗證的起始點(diǎn),調用與其一一對應的Form的validate(...)方法,而Form的validate(...)方法又是逐個(gè)調用其中Field的validate(...)方法實(shí)現的。
二、配置文件說(shuō)明:<form-validation>
<global>
<constant>
<constant-name>驗證方法的標志名</constant-name>
<constant-value>正則表達式</constant-value>
</constant>
<validator name="這個(gè)驗證方法的標志名,供下面的depends調用"
classname="這個(gè)驗證方法在哪個(gè)類(lèi)中,為類(lèi)全名"
method="驗證方法的名稱(chēng)"
methodParams="這個(gè)驗證方法需要的參數類(lèi)型,依次以逗號格開(kāi),為類(lèi)全名"
depends="基于什么驗證之上,可以為多個(gè)值,以逗號格開(kāi),值為方法的標志名"
jsFunction="js的方法全名,格式為文件路徑.方法名。文件路徑以點(diǎn)隔開(kāi),
如果不填,默認為org.apache.commons.validator.javascript.xxxx"
msg="對應于properties文件中的一條,作為不通過(guò)驗證時(shí)返回的信息"/>
</global>
<formset language="語(yǔ)言" country="城市" variant="方言?">
<constant>
<constant-name>驗證方法的標志名</constant-name>
<constant-value>正則表達式</constant-value>
</constant>
<form name="bean 對象名稱(chēng)">
<field property="bean中的屬性名" depends="需要什么樣的驗證,可以為多個(gè)值,以逗號格開(kāi),值為方法的標志名">
<arg name = "變量名" key = "properties文件的key,或者來(lái)自Var的name" resource = "是/否來(lái)自資源文件"/>
<var>
<var-name>變量名</var-name>
<var-value>變量值</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
Commons-Validator(二) 在Validator的配置文件中,一共有如下幾個(gè)基本元素。
一、org.apache.commons.validator.Var 它的作用是為配置文件(validator.xml)中的其它標簽提供可取用的變量,為Field提供執行驗證所需要的其它參數值,比如最大長(cháng)度。這個(gè)類(lèi)有如下屬性:name,變量的名稱(chēng);value,變量的值;jsType,當要自動(dòng)生成js的時(shí)候,js的類(lèi)型。
二、org.apache.commons.validator.Arg 它的作用是替換信息中的某一部分,或者為驗證方法提供必需的參數值。這個(gè)類(lèi)有如下屬性:bundle,資源文件名,用來(lái)存放所需要的信息。key,表示Arg的key或者value。name,表示Arg的名稱(chēng)。position,這個(gè)Arg中的值用來(lái)替換信息中的哪一部分,需要替換的部分以{n}標志。resource:key所指定的信息是否來(lái)自外部的資源文件,默認為true;如果為true,則代表key為buddle屬性所指定的資源文件中的key。
三、org.apache.commons.validator.Msg 它的作用是在驗證不通過(guò)時(shí),應該返回什么的信息。這個(gè)類(lèi)有如下屬性:bundle,資源文件名,用來(lái)存放所需要的信息。key,表示Msg的key或者value。name,表示Msg的名稱(chēng)。resource:key所指定的信息是否來(lái)自外部的資源文件,默認為true;如果為true,則代表key為buddle屬性所指定的資源文件中的key。
四、org.apache.commons.validator.FormSet 這個(gè)類(lèi)管理通過(guò)一個(gè)Map所有要檢驗的Form對象,key為Form的name;同時(shí)通過(guò)一個(gè)Map管理在<formset/>中定義的Constant,key為<constant-name>。同時(shí)其內部有language,country, variant這幾個(gè)屬性,用來(lái)實(shí)現國際化。一個(gè)配置文件可以有多個(gè)FormSet,這些FormSet的區別是要求不同的本地化。
五、org.apache.commons.validator.Form 這個(gè)類(lèi)有如下屬性:name,這個(gè)form的名稱(chēng)。lFields,一個(gè)保存所有Field的List。hFields,一個(gè)保存所有Field的FastHashMap,這個(gè)FastHashMap的key值是對應Field的key屬性(對應配置文件中的property)。這個(gè)類(lèi)通過(guò)validate(...)方法用來(lái)對這個(gè)Form中的所有位置低于page的Field進(jìn)行驗證。它實(shí)際是在一個(gè)循環(huán)中逐個(gè)調用每個(gè)field的validate(...)方法,然后把結果保存在一個(gè)ValidatorResults對象中。
六、org.apache.commons.validator.Field 這個(gè)類(lèi)有如下屬性:depends,依賴(lài)于什么驗證規則。dependencyList保存了以逗號為分隔符把depends分割生成的list。page,如果是多步提交的話(huà)當前是第幾步,值等于或小于表單中page性質(zhì)的值,JavaBean 才會(huì )得到處理;args,是一個(gè)數組;這個(gè)數組的元素為HashMap,每個(gè)HashMap在數組的位置就是其中的Arg中的position屬性的值;HashMap中的key值為Arg的name,如果這個(gè)name為null則為默認的值:DEFAULT_ARG(org.apache.commons.validator.Field.DEFAULT),value為Arg對象。hVars,是一個(gè)FastHashMap,用來(lái)管理所有的Var對象,key為Var的name,值為Var對象。getIndexedListProperty表明這個(gè)property為JavaBean中的一個(gè)數組元素的index。
1、process(Map globalConstants, Map constants)
這個(gè)方法用來(lái)執行配置文件中變量的替換。它的兩個(gè)參數分別為在<global/>和<formset/>中定義的constant。在這個(gè)Map中,key為<constant/>標簽中的constant-name,value為<constant-value>。在配置文件中,可以實(shí)現如下的變量使用方式:Form的property屬性,Var中的value屬性,Arg中的key屬性,Msg的key屬性,他們均可以通過(guò){constant-name}的方式,引用在<global/>或者<formset/>標簽中定義的constant。Arg中的key屬性,可以通過(guò){Var:var-name}的方式引用在<var/>中定義的Var。
FormSet中的process(...)方法依次調用其中的Form的process(...)方法,而Form的process(...)方法又依次調用其中的Field的process(...)方法。
2、validate(Map params, Map actions)
執行驗證,其中actions保存了所有的ValidatorAction對象。它首先會(huì )從params取出key為Validator.BEAN_PARAM(java.lang.Object)的值作為要驗證的JavaBean。然后通過(guò)generateKey()方法判斷當前要驗證的Field是否是IndexedList。如果是,則需要分別對這個(gè)List中的各個(gè)元素進(jìn)行驗證;否則直接執行對與JavaBean的特定屬性(property)執行驗證。
3、validateForRule(...)
接受要執行的ValidatorAction對象的同時(shí),還是會(huì )接受Map actions參數,這是因為這個(gè)要執行的ValidatorAction可能會(huì )依賴(lài)于其它的ValidatorAction。它會(huì )先查找以前的驗證結果,如果以前沒(méi)有執行過(guò)這個(gè)驗證,那么執行runDependentValidators(...)方法,執行它所依賴(lài)于的ValidatorAction;如果通過(guò),那么再對要執行的ValidatorAction,執行驗證。
Commons-Validator(三) 在Validator包中提供了一些Util類(lèi),同時(shí)提供了對基本數據類(lèi)型,時(shí)間,E-mail,信用卡等格式的驗證方法。
一、org.apache.commons.validator.util.Flags 這個(gè)類(lèi)用來(lái)管理一系列的Flag,其中的每個(gè)Flag的值都是2的N次方。然后每個(gè)Flag之間位與(&)就得到了整個(gè)Flags的值。
二、org.apache.commons.validator.util.ValidatorUtils 這個(gè)類(lèi)為Validator提供一些Utility的操作,共有三個(gè)方法。
1、replace(...) 這個(gè)方法用來(lái)將一個(gè)字符串中某個(gè)特性的字符串替換為另一個(gè)字符串,注意這是一個(gè)全局替換方法。
2、getValueAsString(...) 這個(gè)方法用來(lái)獲取某個(gè)Bean中的一個(gè)特定的屬性,然后把屬性值轉換為字符串返回。注意,String[]和Collection類(lèi)型的值,如果里面不包含任何值,則直接返回""。
3、copyFastHashMap(...) 很顯然的是對一個(gè)特定的FashHashMap執行copy。這里要注意的是,如果value為Msg,Arg,Var類(lèi)型的時(shí)候需要執行clone,然后再保存。
三、org.apache.commons.validator.ValidatorUtil 這個(gè)類(lèi)完全通過(guò)調用上面的ValidatorUtils方法,實(shí)現自己的同名方法。只是多了一個(gè)getDelimitedRegExp(...)方法,用來(lái)生成一個(gè)正則表達式。
四、org.apache.commons.validator.DateValidator 實(shí)現了單例模式。這個(gè)類(lèi)用來(lái)檢查日期類(lèi)型是否合法,日期的類(lèi)型要通過(guò)參數傳遞給這個(gè)Validator。同時(shí)還有一個(gè)strict屬性,表示時(shí)候檢查過(guò)渡匹配所要求的日期格式。這個(gè)日期檢查就是通過(guò)formatter.parse(value)方法檢查時(shí)候有異常拋出。
五、org.apache.commons.validator.EmailValidator 實(shí)現了單例模式。這個(gè)類(lèi)用來(lái)檢查Email類(lèi)型是否合法。它通過(guò)正則表達式實(shí)現驗證。
六、org.apache.commons.validator.GenericTypeValidator 這個(gè)類(lèi)實(shí)現了對基本類(lèi)型(Byte,Short,Int,Long,Float, Date)的檢測,方法很簡(jiǎn)單,就是通過(guò)每個(gè)類(lèi)型的構造函數創(chuàng )建相應的對象,如果拋出異常就說(shuō)明不符合,否則符合。同時(shí),這個(gè)類(lèi)還提供對CreditCard驗證的實(shí)現。
Commons-Validator(四) 通過(guò)調用Validator的validate(...)方法,啟動(dòng)驗證。
一、org.apache.commons.validator.Validator 這個(gè)類(lèi)是對一個(gè)Form執行驗證的起點(diǎn),通過(guò)調用這個(gè)類(lèi)的validate(...)方法,啟動(dòng)驗證。這個(gè)類(lèi)中的formName屬性,對應于Form中的name屬性。resources屬性,記錄這個(gè)Validator屬于哪一個(gè)ValidatorResources。parameters用來(lái)管理執行validateXXX(...)方法時(shí)所需要的參數,它是一個(gè)Map,key為類(lèi)全名,value為這個(gè)類(lèi)全名所指的類(lèi)的一個(gè)對象。注意,這個(gè)parameters是這個(gè)Form中所有Field所要執行的所有validateXXX(...)方法時(shí)所需要的參數集合。每個(gè)validateXXX(...)方法,根據自己需要的參數名(類(lèi)全名),從這個(gè)parameters中查取自己所需要的參數。
二、org.apache.commons.validator.ValidatorAction 每個(gè)ValidatorAction對應于配置文件中的一個(gè)<validator/>。它有如下屬性:name,這個(gè)驗正動(dòng)作的標志名,用在depends屬性的配置中。classname,這個(gè)驗證方法在哪個(gè)類(lèi)中,為類(lèi)全名。validationClass,由classname生成的Class。method,這個(gè)驗證方法的名稱(chēng)。validationMethod,由method生成的Method。methodParams,執行這個(gè)驗證方法所需要的參數,值為逗號隔開(kāi)的類(lèi)全名,默認值為Validator.BEAN_PARAM,Validator.VALIDATOR_ACTION_PARAM,Validator.FIELD_PARAM。parameterClasses,由methodParams生成的Class數組。depends,依賴(lài)何ValidatorAction之上。msg,如果沒(méi)有通過(guò)此驗證,應該返回什么消息。javascript,為對應的javascript方法的代碼內容。jsFunction,為對應的js文件名稱(chēng)。jsFunctionName,對應的js中方法的名稱(chēng)。
1、executeValidationMethod(...) 這個(gè)方法用對Field中的值進(jìn)行檢測。它實(shí)際上就是通過(guò)反射,根據類(lèi)名、方法名和參數類(lèi)型執行相應的驗證方法。要注意的是,如果這個(gè)Field為indexList類(lèi)型的,則需要把Java Bean替換為對應的Array中pos指定的元素。同時(shí)Field的key屬性中的[]要變?yōu)閇pos]。
2、這個(gè)類(lèi)還提供了對js的基本操作,解釋如下:*generateJsFunction()
用來(lái)生成名為org.apache.commons.validator.javascript.validateXxxx的js文件名。其中Xxxx與name相對應。
*readJavascriptFile(...)
用來(lái)讀取js文件。由于一個(gè)js文件只包含一個(gè)方法,因此會(huì )讀取所有的內容后,直接返回所讀取的所有內容。
三、org.apache.commons.validator.ValidatorResults 這個(gè)類(lèi)管理對一個(gè)Form中的所有Field執行驗證的結果。它有如下屬性:hResults,用來(lái)管理對所有Field驗證的結果,它的key為field的kye屬性,它的value為ValidatorResult對象。
四、org.apache.commons.validator.ValidatorResult 這個(gè)類(lèi)用來(lái)管理對于一個(gè)Field執行驗證的時(shí)候,所有的驗證方法的結果。它有如下屬性:field,所要驗證的Field對象。hAction,用來(lái)保存所有驗證結果的Map,它的key為ValidatorAction中的name屬性,value為ResultStatus對象。
五、org.apache.commons.validator.ResultStatus 它封裝了對某個(gè)Field執行某個(gè)驗證后的結果。它有如下屬性:valid,表示是否通過(guò)驗證。result:為執行驗證后的結果。
Commons-Validator(五) 最后,說(shuō)明Validator是如何初始化的。
一、org.apache.commons.validator.ValidatorResourcesInitializer 這個(gè)類(lèi)用來(lái)初始化Validator框架,通過(guò)Digester包解析用戶(hù)自定義的xml配置文件。然后把解析的結果保存到ValidatorResources對象中,最后返回這個(gè)ValidatorResources對象。
二、org.apache.commons.validator.ValidatorResources 這個(gè)類(lèi)用來(lái)管理Validator框架中的資源。它包含如下屬性:hFormSets,一個(gè)FastHashMap,用來(lái)管理所有的FormSet,這個(gè)FastHashMap的key為根據FormSet中的本地信息生成的。hConstants,一個(gè)FastHashMap,用來(lái)管理<global/>中定義的constant。hActions,一個(gè)FastHashMap,用來(lái)管理ValidatorAction,它的key為ValidatorAction的name屬性。
三、與struts整合時(shí)需要增加的配置: 在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為用戶(hù)自己配置,配置要驗證的對象。
四、org.apache.struts.validator.FieldChecks
這個(gè)是Struts使用的核心驗證類(lèi),用來(lái)實(shí)現各種驗證規則。其中,validateXXX(...)就是想要創(chuàng )建的方法名,只要規則名沒(méi)有重復即可。validateXXX(...)方法的參數說(shuō)明:
Object 驗證是在此JavaBean 對象上完成的
ValidatorAction 當前所執行的ValidatorAction
Field 被驗證的字段對象
ActionErrors 如果驗證失敗,新增ActionError 對象的錯誤對象
HttpServletRequest 當前的請求對象
五、org.apache.commons.validator.ValidatorResources
這個(gè)類(lèi)用來(lái)通過(guò)Arg替換Msg中格式為{N}的字符串
六、org.apache.commons.validator.ValidatorPlugIn
這個(gè)類(lèi)用來(lái)初始化Validator,然后把初始化生成的ValidatorResources對象保存到ServletContext中,key為VALIDATOR_KEY + config.getPrefix()。
七、org.apache.struts.validator.Resources
這個(gè)類(lèi)用來(lái)初始化一個(gè)Validator對象,它首先通過(guò)key值VALIDATOR_KEY + config.getPrefix()從ServletContext取得相應的ValidatorResources對象。它再以這個(gè)對象為參數構造一個(gè)Validator對象,然后把驗證方法需要的參數保存到Validator對象的parameters屬性中
七、org.apache.struts.validator.Resources
這個(gè)類(lèi)用來(lái)初始化一個(gè)Validator對象,它首先通過(guò)key值VALIDATOR_KEY + config.getPrefix()從ServletContext取得相應的ValidatorResources對象。它再以這個(gè)對象為參數構造一個(gè)Validator對象,然后把驗證方法需要的參數保存到Validator對象的parameters屬性中。