Knight of the round table

          wansong

          struts 1 校驗(yàn)

          http://hi.baidu.com/ln_software/blog/item/54e0838021d7c3a90df4d227.html
          http://lucky16.javaeye.com/blog/450144
          http://www.javaeye.com/topic/154151

          如這樣的500錯(cuò)誤:No input attribute for mapping path.  Validator要求頁(yè)面做驗(yàn)證
          解決辦法一:
          在struts_config.xml里的<action里加入input
          解決辦法二:
          把struts_config.xml里的<action里的validator改成false



          Struts作為一個(gè)不停發(fā)展的開源項(xiàng)目,在頁(yè)面校驗(yàn)這一塊采用了Jakarta的Commons項(xiàng)目的Validate,結(jié)合Struts的MVC體系,
          用起來(lái)確實(shí)不錯(cuò)。建議校驗(yàn)這部分在完成jsp后加入。
          原理:Struts的頁(yè)面校驗(yàn)分兩種方法,一種是前臺(tái)生成Javascript,一種是后臺(tái)class。
                而出錯(cuò)信息對(duì)應(yīng)的也有兩種顯示方法,一種是彈出消息框,一種是在原頁(yè)面顯示。
                我個(gè)人比較喜歡彈出消息框這種,因?yàn)榭梢詫⒔裹c(diǎn)置到出錯(cuò)的field中。
                所以我側(cè)重介紹如何實(shí)現(xiàn)這種。
                請(qǐng)按下列步驟一步一步進(jìn)行,進(jìn)行的時(shí)候思考它的做法。
               
          1     將Struts所需lib加入到項(xiàng)目lib路徑或服務(wù)器的lib路徑
                Struts1.1需要如下lib:struts-legacy.jar struts.jar jakarta-oro.jar commons-validator.jar
                commons-logging.jar commons-lang.jar commons-fileupload.jar commons-digester.jar commons-collections.jar
                commons-beanutils.jar(可以看到Struts1.1用了很多Commons項(xiàng)目的東東)
          2     將下載的Struts1.1的包中的webapps\struts-validator.war 中的validation.xml和validator-rules.xml
                拷到項(xiàng)目的WEB-INF路徑
                仔細(xì)研究一下這兩個(gè)文件,可以看到validator-rules.xml是提供一些常用的validation規(guī)則。
                目前提供了required,requiredif,minlength,maxlength,mask,byte,short,integer,long,float,
                double,date,range,intRange,floatRange,creditCard,email,
                我看了一下,只有mask不知道具體是干啥的,其他望文生義。(至于如何DIY一條自己的rule,俺還不會(huì))
                重頭戲來(lái)了,修改validation.xml。可以看一下validation.xml結(jié)構(gòu)
          validation.xml:     
          <?xml version="1.0" encoding="ISO-8859-1" ?>

          <!DOCTYPE form-validation PUBLIC
                    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
                    "

          <form-validation>
             <global>
                <constant>
                  <constant-name>phone</constant-name>
                  <constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$</constant-value>
                </constant>
                <constant>
                  <constant-name>zip</constant-name>
                  <constant-value>^\d{5}\d*$</constant-value>
                </constant>
             </global>
             <formset>
                <constant>
                  <constant-name>zip</constant-name>
                  <constant-value>^\d{5}(-\d{4})?$</constant-value>
                </constant>

                <form    name="registrationForm">
                   <field    property="firstName"
                       depends="required,mask,minlength">
                         <arg0 key="registrationForm.firstname.displayname"/>
                         <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                               <var>
                                 <var-name>mask</var-name>
                                 <var-value>^\w+$</var-value>
                               </var>
                               <var>
                                 <var-name>minlength</var-name>
                                 <var-value>5</var-value>
                               </var>
                   </field>
                  ..........
                
                相信大家仔細(xì)一看就明白了,首先,可以定義一些用正則表達(dá)式表示的規(guī)則,這些規(guī)則還分全局和局部。
                這樣就可以DIY一些可以用正則表達(dá)式表示的規(guī)則了,例如下面就具體用到了自定義的規(guī)則:phone。
                ...
             <global>
                <constant>
                  <constant-name>phone</constant-name>
                  <constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$</constant-value>
                </constant>
             </global>
             ...  
                <field    property="mobile"
                       depends="mask">
                         <arg0 key="registrationForm.mobile.displayname"/>
                               <var>
                                 <var-name>mask</var-name>
                                 <var-value>${phone}</var-value>
                               </var>
                </field>
             ...
                這下也明白mask的作用了,原來(lái)它是專門用于自定義規(guī)則!
                然后就可以添加需要加validation的field了,格式如下:
                <formset>
                <form name="registrationForm">
                   <field    property="firstName"
                       depends="required,mask,minlength">
                         <arg0 key="registrationForm.firstname.displayname"/>
                         <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                               <var>
                                 <var-name>mask</var-name>
                                 <var-value>^\w+$</var-value>
                               </var>
                               <var>
                                 <var-name>minlength</var-name>
                                 <var-value>5</var-value>
                               </var>
                   </field>
                </form>
                </formset>
               
          3     將需要加validation的formbean全部改成 extends ValidatorForm
          4     在struts-config.xml文件中加入一段代碼<plug-in></plug-in>,位置如下:
          ......
              <action name="performanceSearchForm" path="/performanceRptAction" scope="request" type="com.hp.elog2.action.report.PerformanceRptAction">
                <forward name="success" path="/FinalRpt.jsp" redirect="false" />
              </action>
            </action-mappings>
            <message-resources parameter="ApplicationResources" />
            <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
              <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
            </plug-in>
          </struts-config>

          5     在ApplicationResources.properties文件中加入如下內(nèi)容:

          # Errors
          errors.header=Validation Error
          errors.required={0} is required.
          errors.minlength={0} can not be less than {1} characters.
          errors.maxlength={0} can not be greater than {1} characters.
          errors.invalid={0} is invalid.
          errors.byte={0} must be an byte.
          errors.short={0} must be an short.
          errors.integer={0} must be an integer.
          errors.long={0} must be an long.
          errors.float={0} must be an float.
          errors.double={0} must be an double.
          errors.date={0} is not a date.
          errors.range={0} is not in the range {1} through {2}.
          errors.creditcard={0} is not a valid credit card number.
          errors.email={0} is an invalid e-mail address.
                
                且注意在修改validation.xml時(shí),如
                 <arg0 key="registrationForm.firstname.displayname"/>
                則ApplicationResources.properties中要有對(duì)應(yīng)的 registrationForm.firstname.displayname 值。
                這就可以實(shí)現(xiàn)出錯(cuò)信息本地化。

          6     修改要加validation的jsp文件。兩處:
                  1 在頁(yè)面的form標(biāo)簽中加入onsubmit事件
                  <html:form action="registration" onsubmit="return validateRegistrationForm(this);">
                  2 在</body>之前加入一段代碼,內(nèi)容如下:
                  <html:javascript formName="registrationForm"/>
                  這段代碼會(huì)自動(dòng)生成上面的validateRegistrationForm(this)函數(shù)

          posted on 2010-09-22 22:08 w@ns0ng 閱讀(221) 評(píng)論(0)  編輯  收藏 所屬分類: Struts

          主站蜘蛛池模板: 蕉岭县| 芮城县| 东明县| 安岳县| 剑阁县| 江山市| 金塔县| 扎赉特旗| 堆龙德庆县| 彰武县| 泗水县| 兴国县| 棋牌| 繁峙县| 武安市| 土默特右旗| 清新县| 南雄市| 新津县| 青州市| 承德县| 娄烦县| 吴堡县| 湖南省| 莒南县| 乌拉特中旗| 宁城县| 安顺市| 吕梁市| 张家界市| 商都县| 新乡县| 黔南| 南陵县| 荆门市| 峨山| 博客| 沽源县| 明星| 拜城县| 万全县|