風行天下

          JAVA太極
          posts - 4, comments - 10, trackbacks - 0, articles - 55
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Jakarta Commons Validator

          Posted on 2005-04-04 11:19 風太少 閱讀(375) 評論(0)  編輯  收藏
          SECTION 01 Validator 總覽

          Validate 驗證, 這件事情, 寫程序是非常重要的, 要先判斷數據是否正確, 才讓動作或事件繼續執行下去, 那么, 每次都寫相同的驗證模式, 不如對于這個 JavaBean 的數據驗證透過 XML 的設定, 如果正確則為驗證成功, 發生錯誤則為驗證失敗. 對于完全沒有用過 Bean Validation 的人來說, 聽起來, 可能有點吃力, 不過看過例子可能就了解了.


          最新版本為 v1.0.2


          binary 下載
          source 下載
          這次請下載 source 因為有許多范例程序在其中.


          SECTION 02 基本范例

          大家可以查看 org.apache.commons.validator.example.* 的文件, 其實很簡單, 只有 ValidateExample.java 及 ValidateBean.java 這兩個程序, 還有 validator-example.xml 來作為 Bean 的驗證設定. 另外 applicationResources.properties 是設定多國語言 (i18n)

          大家可以直接參閱 ValidateExample, 設定 Validator 的方法其實很簡單
          1. 建立 ValidatorResource Instance , 并且取得驗證的配置文件
            
            ValidatorResources resources = new ValidatorResources();
            in = ValidateExample.class.getResourceAsStream("validator-example.xml");
            ValidatorResourcesInitializer.initialize(resources, in);
            			
          2. 建立要被驗證的 JavaBean
            
            ValidateBean bean = new ValidateBean();
            
          3. 建立驗證者, 并且告知是哪個 JavaBean 需要驗證
            
            Validator validator = new Validator(resources, "ValidateBean");
            validator.addResource(Validator.BEAN_KEY, bean);
            
          4. 建立驗證結果儲存區, 將驗證結果放入
            
            ValidatorResults results = null;
            results = validator.validate();
            
          ValidatorResults 是一個 HashMap 儲存 ValidateResult, 他是依照 property 為 key,

          ValidatorResult result = results.getValidatorResult(propertyName);

          取出 ValidatorResult; 接著用 isValid() method 去判斷是否驗證成功.




          SECTION 03 validator-example.xml

          
             <global>
                <validator name="int"
                           classname="org.apache.commons.validator.TestTypeValidator"
                           method="validateInt"
                           methodParams="java.lang.Object,org.apache.commons.validator.Field"
                           msg="errors.int"/>
          
                <validator name="required"
                           classname="org.apache.commons.validator.TestValidator"
                           method="validateRequired"
                           methodParams="java.lang.Object,org.apache.commons.validator.Field"
                           msg="errors.required"/>
             </global>
             <formset>
                <form name="ValidateBean">
                   <field property="firstName"  depends="required">
                   	   <arg0 key="nameForm.firstname.displayname"/>
                   </field>    
          
                </form>
             </formset>   
          </form-validation>
          
          
          
          在 global 的地方是告知, 各種情況需要用到那一個 Validator 來判斷, 并且設定錯誤訊息, 將會參考 ApplicationResource.properties 的內容來顯示, 而 form 的判斷模式, 可以放入顯示時候的名稱, "errors.required=The {0} field is required." 如果發生驗證失敗, 將會把 nameForm.firstname.displayname ( 也就是寫在 properties 中的 First Name ) 取代 {0} 的地方


          SECTION 04 Validator 的寫法

          最重要的就是寫 public static boolean validateXxxxx( Object bean, Field field ) 這樣的 method
          
          public class TestValidator {
                                                                    
             /**
              * Checks if the field is required.
              *
              * @param 	value 		The value validation is being performed on.
              * @return	boolean		If the field isn't null and 
              *                           has a length greater than zero, 
              *                           true is returned.  
              *                           Otherwise false.
             */
             public static boolean validateRequired(Object bean, Field field) {
                String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
          
                return !GenericValidator.isBlankOrNull(value);
             }
          }  
          



          SECTION 05 GenericValidator

          目前 GenericValidator 提供了
          • isBlankOrNull(java.lang.String value) : 檢查是否為空值,及去掉空白后長度是否大于零
          • isByte(java.lang.String value) : 是否可以轉成 byte
          • isCreditCard(java.lang.String value) : 是否為正確的信用卡號
          • isDate(java.lang.String value, java.util.Locale locale) : 是否為有效的日期, 可依照區域別判斷
          • isDate(java.lang.String value, java.lang.String datePattern, boolean strict) : 是否為有效的日期, 可輸入日期格式, 是否需要完全符合
          • isDouble(java.lang.String value) : 是否可以轉成 double
          • isEmail(java.lang.String value) : 是否為有效的 Email
          • isFloat(java.lang.String value) : 是否可以轉成 float
          • isInRange(double value, double min, double max) : 輸入數值是否在此區間 ( double )
          • isInRange(float value, float min, float max) : 輸入數值是否在此區間 ( float )
          • isInRange(int value, int min, int max) : 輸入數值是否在此區間 ( int )
          • isInRange(short value, short min, short max) : 輸入數值是否在此區間 ( short )
          • isInt(java.lang.String value) : 是否可以轉成 int
          • isLong(java.lang.String value) : 是否可以轉成 long
          • isShort(java.lang.String value) : 是否可以轉成 short
          • matchRegexp(java.lang.String value, java.lang.String regexp) : 是否符合輸入的 Regular Expression
          • maxLength(java.lang.String value, int max) : 長度不得大于輸入值
          • minLength(java.lang.String value, int min) : 長度不得小于輸入值
          我認為最好用的就是 matchRegexp 可以設定成各式各樣的判斷.


          SECTION 06 Struts Validator

          原本最早 , Struts-validate 是由 http://home.earthlink.net/~dwinterfeldt/revision.html 這里開始的, 2002 初開始使用 commons-validator, 就轉移到 jakarta 繼續開發, 你會發現 commons-validator 的開發人員都是 struts 的開發人員.


          在 struts 可以透過 plug-in 設定 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>
          
          ValidatorPlugIn.java , 是一個實現 PlugIn ( "init()" & "destroy()" ) 的一個 Servlet
          
          public class ValidatorPlugIn implements PlugIn {
              public void init(ActionServlet servlet, ModuleConfig config)
                  throws ServletException {
          		......
          		initResources();
          		......
          	}
          
          	protected void initResources() throws IOException, ServletException {
          		......
          		ValidatorResourcesInitializer.initialize(resources, bis, false);
          		......
          	}
          
              public void destroy() {
          		.....
              }
          }
          
          而 ValidatorResourcesInitializer 就是屬于 commons-validator 的組件,

          另外的 /WEB-INF/validator-rules.xml, 包含了 client 端 javascirpt 的驗證, 和 commons-validator 的驗證.

          最后的 /WEB-INF/validation.xml, 就是針對 FormBean 來作驗證, 當然你可以自行用 commons-validator 對于 ValueObject 作驗證.


          SECTION 07 總結

          如果不是要與 EIS ( DB layer ) 層級作處理的, 大家可以對于輸入的資料通過 Validator 標準的模式, 撰寫自己公司商業邏輯的 validator.

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 中方县| 石景山区| 女性| 馆陶县| 凤城市| 海安县| 雷山县| 遂平县| 崇文区| 夏邑县| 兴山县| 滨州市| 洛宁县| 保康县| 南乐县| 嘉兴市| 屏南县| 永春县| 普兰店市| 登封市| 运城市| 武山县| 梅河口市| 长岛县| 木里| 绵竹市| 吴江市| 陇南市| 连江县| 大理市| 逊克县| 伽师县| 兴国县| 和平县| 南投县| 乳源| 五原县| 福鼎市| 保康县| 万州区| 钦州市|