午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          posts - 48,comments - 118,trackbacks - 79

          在Struts中對用戶輸入信息的校驗一般在FromBean中進行(除非需要訪問數據庫進行諸如登錄信息的校驗,因為這是Action的工作),本文將闡述如何在Struts中實現可配置的信息校驗。

          一、在FormBean中手工實現

          最簡單的方法是直接在FormBean中重寫ActionForm類的validate方法,validate方法簽名如下:

          public ActionErrors validate(ActionMapping mapping, HttpServletRequest req)

          比如需要校驗age字段必須填寫數字:

           1public ActionErrors validate(ActionMapping mapping, HttpServletRequest req){
           2  ActionErrors errors = new ActionErrors();
           3
           4  String age = this.getAge();
           5  if(!this.isNumber(age))// isNumber() is not implemented
           6    errors.add(  ,  );
           7  }

           8
           9  return errors;
          10}

          在form提交后,容器會調用validate方法對表單數據進行校驗,如果返回的ActionErrors為空(即校驗通過),則將FormBean提交Action,否則重定向到提交form的頁面。
          這種方法實現簡單,直觀,容易測試、調試,但不可避免地存在以下缺點:

          1、很難重用,導致重復開發
          有很多校驗邏輯在整個網站中是相同的,比如上述的數字校驗,還有email校驗、長度校驗等等,而通過覆蓋validate方法很難對這些校驗過程進行重用,除非定義一些helper類封裝校驗方法(比如上述的isNumber())。而當需要為另一個FormBean加入相同的校驗邏輯時必須重復地覆蓋validate方法

          2、難于擴展
          當要對一個表單增、刪、改校驗邏輯時必須修改validate方法,重新打包、部署

          3、不可配置
          因為校驗邏輯硬編碼于class文件中,運行時不可能做到靈活地配置校驗邏輯

          因此,Struts中加入了另一種更靈活的校驗機制:

          二、使用Validator

          Validator提供了一種基于xml配置文件的校驗模型,要使用這一模型必須做如下實現:

          1、FormBean繼承org.apache.struts.validator.ValidatorForm而不是ActionForm

          2、不覆蓋validate方法

          3、創建validator-rules.xml及validation.xml文件
          validator-rules.xml定義了可用來配置的校驗邏輯,如:

            1<form-validation>
            2   <global>
            3      <validator name="required"
            4            classname="org.apache.struts.validator.FieldChecks"
            5               method="validateRequired"
            6         methodParams="java.lang.Object,
            7                       org.apache.commons.validator.ValidatorAction,
            8                       org.apache.commons.validator.Field,
            9                       org.apache.struts.action.ActionMessages,
           10                       org.apache.commons.validator.Validator,
           11                       javax.servlet.http.HttpServletRequest"
           12                  msg="errors.required"/>
           13      <validator name="requiredif"
           14                 classname="org.apache.struts.validator.FieldChecks"
           15                 method="validateRequiredIf"
           16                 methodParams="java.lang.Object,
           17                               org.apache.commons.validator.ValidatorAction,
           18                               org.apache.commons.validator.Field,
           19                               org.apache.struts.action.ActionMessages,
           20                               org.apache.commons.validator.Validator,
           21                               javax.servlet.http.HttpServletRequest"
           22                 msg="errors.required"/>
           23      <validator name="validwhen"
           24          msg="errors.required"
           25                 classname="org.apache.struts.validator.validwhen.ValidWhen"
           26                 method="validateValidWhen"
           27                 methodParams="java.lang.Object,
           28                       org.apache.commons.validator.ValidatorAction,
           29                       org.apache.commons.validator.Field,
           30                       org.apache.struts.action.ActionMessages,
           31                       org.apache.commons.validator.Validator,
           32                       javax.servlet.http.HttpServletRequest"/>
           33      <validator name="minlength"
           34            classname="org.apache.struts.validator.FieldChecks"
           35               method="validateMinLength"
           36         methodParams="java.lang.Object,
           37                       org.apache.commons.validator.ValidatorAction,
           38                       org.apache.commons.validator.Field,
           39                       org.apache.struts.action.ActionMessages,
           40                       org.apache.commons.validator.Validator,
           41                       javax.servlet.http.HttpServletRequest"
           42              depends=""
           43                  msg="errors.minlength"
           44           jsFunction="org.apache.commons.validator.javascript.validateMinLength"/>
           45      <validator name="maxlength"
           46            classname="org.apache.struts.validator.FieldChecks"
           47               method="validateMaxLength"
           48         methodParams="java.lang.Object,
           49                       org.apache.commons.validator.ValidatorAction,
           50                       org.apache.commons.validator.Field,
           51                       org.apache.struts.action.ActionMessages,
           52                       org.apache.commons.validator.Validator,
           53                       javax.servlet.http.HttpServletRequest"
           54              depends=""
           55                  msg="errors.maxlength"
           56           jsFunction="org.apache.commons.validator.javascript.validateMaxLength"/>
           57      <validator name="mask"
           58            classname="org.apache.struts.validator.FieldChecks"
           59               method="validateMask"
           60         methodParams="java.lang.Object,
           61                       org.apache.commons.validator.ValidatorAction,
           62                       org.apache.commons.validator.Field,
           63                       org.apache.struts.action.ActionMessages,
           64                       org.apache.commons.validator.Validator,
           65                       javax.servlet.http.HttpServletRequest"
           66              depends=""
           67                  msg="errors.invalid"/>
           68      <validator name="byte"
           69            classname="org.apache.struts.validator.FieldChecks"
           70               method="validateByte"
           71         methodParams="java.lang.Object,
           72                       org.apache.commons.validator.ValidatorAction,
           73                       org.apache.commons.validator.Field,
           74                       org.apache.struts.action.ActionMessages,
           75                       org.apache.commons.validator.Validator,
           76                       javax.servlet.http.HttpServletRequest"
           77              depends=""
           78                  msg="errors.byte"
           79       jsFunctionName="ByteValidations"/>
           80      <validator name="short"
           81            classname="org.apache.struts.validator.FieldChecks"
           82               method="validateShort"
           83         methodParams="java.lang.Object,
           84                       org.apache.commons.validator.ValidatorAction,
           85                       org.apache.commons.validator.Field,
           86                       org.apache.struts.action.ActionMessages,
           87                       org.apache.commons.validator.Validator,
           88                       javax.servlet.http.HttpServletRequest"
           89              depends=""
           90                  msg="errors.short"
           91       jsFunctionName="ShortValidations"/>
           92      <validator name="integer"
           93            classname="org.apache.struts.validator.FieldChecks"
           94               method="validateInteger"
           95         methodParams="java.lang.Object,
           96                       org.apache.commons.validator.ValidatorAction,
           97                       org.apache.commons.validator.Field,
           98                       org.apache.struts.action.ActionMessages,
           99                       org.apache.commons.validator.Validator,
          100                       javax.servlet.http.HttpServletRequest"
          101              depends=""
          102                  msg="errors.integer"
          103       jsFunctionName="IntegerValidations"/>
          104      <validator name="long"
          105            classname="org.apache.struts.validator.FieldChecks"
          106               method="validateLong"
          107         methodParams="java.lang.Object,
          108                       org.apache.commons.validator.ValidatorAction,
          109                       org.apache.commons.validator.Field,
          110                       org.apache.struts.action.ActionMessages,
          111                       org.apache.commons.validator.Validator,
          112                       javax.servlet.http.HttpServletRequest"
          113              depends=""
          114                  msg="errors.long"/>
          115      <validator name="float"
          116            classname="org.apache.struts.validator.FieldChecks"
          117               method="validateFloat"
          118         methodParams="java.lang.Object,
          119                       org.apache.commons.validator.ValidatorAction,
          120                       org.apache.commons.validator.Field,
          121                       org.apache.struts.action.ActionMessages,
          122                       org.apache.commons.validator.Validator,
          123                       javax.servlet.http.HttpServletRequest"
          124              depends=""
          125                  msg="errors.float"
          126       jsFunctionName="FloatValidations"/>
          127      <validator name="double"
          128            classname="org.apache.struts.validator.FieldChecks"
          129               method="validateDouble"
          130         methodParams="java.lang.Object,
          131                       org.apache.commons.validator.ValidatorAction,
          132                       org.apache.commons.validator.Field,
          133                       org.apache.struts.action.ActionMessages,
          134                       org.apache.commons.validator.Validator,
          135                       javax.servlet.http.HttpServletRequest"
          136              depends=""
          137                  msg="errors.double"/>
          138      <validator name="date"
          139            classname="org.apache.struts.validator.FieldChecks"
          140               method="validateDate"
          141         methodParams="java.lang.Object,
          142                       org.apache.commons.validator.ValidatorAction,
          143                       org.apache.commons.validator.Field,
          144                       org.apache.struts.action.ActionMessages,
          145                       org.apache.commons.validator.Validator,
          146                       javax.servlet.http.HttpServletRequest"
          147              depends=""
          148                  msg="errors.date"
          149       jsFunctionName="DateValidations"/>
          150      <validator name="intRange"
          151            classname="org.apache.struts.validator.FieldChecks"
          152               method="validateIntRange"
          153         methodParams="java.lang.Object,
          154                       org.apache.commons.validator.ValidatorAction,
          155                       org.apache.commons.validator.Field,
          156                       org.apache.struts.action.ActionMessages,
          157                       org.apache.commons.validator.Validator,
          158                       javax.servlet.http.HttpServletRequest"
          159              depends="integer"
          160                  msg="errors.range"/>
          161      <validator name="floatRange"
          162            classname="org.apache.struts.validator.FieldChecks"
          163               method="validateFloatRange"
          164         methodParams="java.lang.Object,
          165                       org.apache.commons.validator.ValidatorAction,
          166                       org.apache.commons.validator.Field,
          167                       org.apache.struts.action.ActionMessages,
          168                       org.apache.commons.validator.Validator,
          169                       javax.servlet.http.HttpServletRequest"
          170              depends="float"
          171                  msg="errors.range"/>
          172      <validator name="doubleRange"
          173            classname="org.apache.struts.validator.FieldChecks"
          174               method="validateDoubleRange"
          175         methodParams="java.lang.Object,
          176                       org.apache.commons.validator.ValidatorAction,
          177                       org.apache.commons.validator.Field,
          178                       org.apache.struts.action.ActionMessages,
          179                       org.apache.commons.validator.Validator,
          180                       javax.servlet.http.HttpServletRequest"
          181              depends="double"
          182                  msg="errors.range"/>
          183      <validator name="creditCard"
          184            classname="org.apache.struts.validator.FieldChecks"
          185               method="validateCreditCard"
          186         methodParams="java.lang.Object,
          187                       org.apache.commons.validator.ValidatorAction,
          188                       org.apache.commons.validator.Field,
          189                       org.apache.struts.action.ActionMessages,
          190                       org.apache.commons.validator.Validator,
          191                       javax.servlet.http.HttpServletRequest"
          192              depends=""
          193                  msg="errors.creditcard"/>
          194      <validator name="email"
          195            classname="org.apache.struts.validator.FieldChecks"
          196               method="validateEmail"
          197         methodParams="java.lang.Object,
          198                       org.apache.commons.validator.ValidatorAction,
          199                       org.apache.commons.validator.Field,
          200                       org.apache.struts.action.ActionMessages,
          201                       org.apache.commons.validator.Validator,
          202                       javax.servlet.http.HttpServletRequest"
          203              depends=""
          204                  msg="errors.email"/>
          205      <validator name="url"
          206            classname="org.apache.struts.validator.FieldChecks"
          207               method="validateUrl"
          208         methodParams="java.lang.Object,
          209                       org.apache.commons.validator.ValidatorAction,
          210                       org.apache.commons.validator.Field,
          211                       org.apache.struts.action.ActionMessages,
          212                       org.apache.commons.validator.Validator,
          213                       javax.servlet.http.HttpServletRequest"
          214              depends=""
          215                  msg="errors.url"/>
          216     <!--
          217       This simply allows struts to include the validateUtilities into a page, it should
          218       not be used as a validation rule.
          219     -->
          220     <validator name="includeJavaScriptUtilities"
          221            classname=""
          222               method=""
          223         methodParams=""
          224              depends=""
          225                  msg=""
          226           jsFunction="org.apache.commons.validator.javascript.validateUtilities"/>           
          227      <validator name="codeinput"
          228            classname="consultII.web.utils.MyValidator"
          229               method="validateCodeInput"
          230         methodParams="java.lang.Object,
          231                       org.apache.commons.validator.ValidatorAction,
          232                       org.apache.commons.validator.Field,
          233                       org.apache.struts.action.ActionMessages,
          234                       javax.servlet.http.HttpServletRequest"
          235                  msg="errors.code"/>
          236      <validator name="userinfo"
          237            classname="consultII.web.utils.MyValidator"
          238               method="validateUserInfo"
          239         methodParams="java.lang.Object,
          240                       org.apache.commons.validator.ValidatorAction,
          241                       org.apache.commons.validator.Field,
          242                       org.apache.struts.action.ActionMessages,
          243                       javax.servlet.http.HttpServletRequest"
          244                  msg="errors.info"/>
          245   </global>
          246</form-validation>

          該配置文件的具體格式請查閱Struts的官方文檔??梢钥闯銎渲袑芏喑S玫男r炦壿嬤M行了封裝,比如數字校驗(92行到103行),長度校驗(33行到56行)等。

          而validation.xml則是Validator的核心,其中可對各個FormBean中需要校驗字段及校驗邏輯進行靈活的配置:

           1<form-validation>
           2   <formset>
           3      <form name="login">
           4         <field property="username" depends="required"/>
           5         <field property="password" depends="required"/>
           6         <field property="input" depends="required,codeinput"/>
           7      </form>
           8      <form name="search">
           9        <field property="keyword" depends="required"/>
          10      </form>
          11      <form name="signin">
          12         <field property="username" depends="required"/>
          13         <field property="password" depends="required"/>
          14         <field property="passagain" depends="required"/>
          15         <field property="question" depends="required,userinfo"/>
          16         <field property="answer" depends="required,userinfo"/>
          17         <field property="age" depends="required,integer"/>
          18         <field property="input" depends="required,codeinput"/>
          19         <field property="email" depends="email"/>
          20      </form>
          21      <form name="ask">
          22         <field property="content" depends="required"/>
          23      </form>
          24   </formset>
          25</form-validation>
          26

          具體格式可查閱官方文檔,如上例,3到5行定義了需要對名為“loging”的FormBean的“username”、“password”分別進行“required”校驗(即必填字段)。校驗邏輯之間可以組合,如第6行的“required,codeinput”,定義了先進行required校驗,通過了再進行codeinput校驗。

          與在validate方法內進行校驗相比,使用Validator的優勢就很明顯了,可重用(從上述xml文件可以看出對很多字段都進行了required校驗);可靈活配置、擴展,只需修改validation.xml文件就可以改變校驗邏輯。

          posted on 2006-03-07 17:53 ^ Mustang ^ 閱讀(5298) 評論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 锦屏县| 始兴县| 扎兰屯市| 金山区| 拜城县| 法库县| 吴川市| 资源县| 涡阳县| 遵义县| 驻马店市| 霍山县| 城市| 平果县| 邵阳县| 霍林郭勒市| 本溪| 大足县| 多伦县| 长宁县| 全椒县| 陕西省| 远安县| 九龙坡区| 古交市| 蒲江县| 新闻| 太谷县| 遂川县| 来凤县| 开阳县| 团风县| 千阳县| 祁阳县| 光山县| 桐庐县| 克山县| 乌兰察布市| 德阳市| 常宁市| 云和县|