posts - 5, comments - 24, trackbacks - 0, articles - 20
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Validator驗證框架

          Posted on 2006-09-25 20:50 kook 閱讀(4916) 評論(2)  編輯  收藏 所屬分類: Struts
          Struts1.2中創(chuàng)建驗證框架的步驟:

          1、在struts-config.xml文件中添加下列內(nèi)容:
          < plug - in?className = " org.apache.struts.validator.ValidatorPlugIn " >
          ????????
          < set - property?property = " pathnames " ?value = " /WEB-INF/validator-rules.xml,
          ??????????????????????????????????????????????????????????????????/WEB-INF/validation.xml
          " ? />

          </ plug - in >

          注意:這些內(nèi)容必須放在<message-resources>元素之后。該規(guī)則是由
          "
          http://struts.apache.org/dtds/struts-config_1_2.dtd "文件制定的。

          2、創(chuàng)建相關(guān)的組件:

          為了實驗的目的,我依次創(chuàng)建4個ActionForm類,一個JSP,一個Action類,以下是他們在struts-config.xml中的配置信息:
          ?1?<form-beans?>
          ?2?????<form-bean?name="DVForm"?type="org.apache.struts.validator.DynaValidatorForm">
          ?3???????<form-property?name="name"?type="java.lang.String"?/>
          ?4?????</form-bean>
          ?5?????<form-bean?name="DVAForm"?type="org.apache.struts.validator.DynaValidatorActionForm">
          ?6???????<form-property?name="name"?type="java.lang.String"?/>
          ?7?????</form-bean>
          ?8?????<form-bean?name="VForm"?type="com.kook.struts.form.HahaForm"?/>
          ?9?????<form-bean?name="VAForm"?type="com.kook.struts.form.HohoForm"?/>
          10???</form-beans>
          11?
          12???<global-exceptions?/>
          13???<global-forwards?/>
          14???<action-mappings?>
          15?????< action
          16???????attribute="DVForm"

          17???????input="/form/index.jsp"
          18???????name="DVForm"
          19???????path="/index"
          20???????scope="request"
          21???????type="com.kook.struts.action.IndexAction"?/>
          22???</action-mappings>

          其中
          <form-bean name="VForm" type="com.kook.struts.form.HahaForm" />是ValidatorForm類的子類
          <form-bean name="VAForm" type="com.kook.struts.form.HohoForm" />是ValidatorActionForm類的子類

          下面是JSP頁面代碼:
          1?<html:form?action="/index"?onsubmit="return?validateDVForm(this)">
          2?????????????name?:?<html:text?property="name"/><html:errors?property="name"/><br/>
          3?????????????<html:submit/>
          4??</html:form>
          5??<html:javascript?formName="DVForm"/>

          因為只是做表單驗證,action類可以不用涉及,因此不列出action類的代碼啦!

          3、刪除name="VForm" 和name="VAForm"的ActionForm中的validate方法。

          因為這兩個類不是動態(tài)的驗證類,在使用向?qū)纱a的時候會自動覆蓋父類的validate方法。如果不刪除的話,根據(jù)類的多態(tài)性原理,會調(diào)用他們生成的validate方法,而不調(diào)用他們父類的該方法。但是,實際上,是他們父類的validate方法調(diào)用了validator框架的驗證方法,因此我們沒有必要再去重寫他的這個方法。同時也要記得刪除,因為向?qū)傻氖强諏崿F(xiàn),不刪除的話,起不到驗證作用。切記切記!!!曾經(jīng)在這吃啊擔子滴!!

          觀察以上代碼不難發(fā)現(xiàn),表單中只有一個文本框,因此實驗也是對這個文本框進行驗證。

          4、創(chuàng)建自定義的驗證文件validation.xml,主要內(nèi)容如下所示:
          ?1?<form-validation> ????
          ?2?????<formset>

          ?3?????????<form?name="DVForm">
          ?4?????????????<field?property="name"?depends="required">
          ?5?????????????????
          ?6?????????????????<arg0?name="required"?key="lable.name"/>
          ?7?????????????</field>
          ?8?????????</form>
          ?9?????</formset>
          10?</form-validation>

          其中key="lable.name "在資源文件中對應(yīng)的內(nèi)容為:lable.name=name,因此,當文本框中沒有輸入任何信息而提交的時候,將會反饋一條name is required.的信息。

          下面開始實驗,
          實驗的目的是:依次使用4種驗證Form來實現(xiàn)表單的驗證功能,
          他們分別是:DynaValidatorForm,DynaValidatorActionForm,ValidatorForm,ValidatorActionForm。這也是前面為什么要創(chuàng)建4個ActionForm的目的,詳細配置信息見前面struts-config.xml
          而JSP頁面只有一個,就是配置文件中的input="/form/index.jsp
          "

          實驗一:由DynaValidatorForm的子類DVForm來驗證



          validation.xml的內(nèi)容為:
          ?1?<form-validation> ????
          ?2?????<formset>

          ?3?????????<form?name="DVForm">
          ?4?????????????<field?property="name"?depends="required">
          ?5?????????????????
          ?6?????????????????<arg0?name="required"?key="lable.name"/>
          ?7?????????????</field>
          ?8?????????</form>
          ?9?????</formset>
          10?</form-validation>

          struts-config.xml的內(nèi)容為:
          15?????< action
          16???????attribute="DVForm"

          17???????input="/form/index.jsp"
          18???????name="DVForm"
          19???????path="/index"
          20???????scope="request"
          21???????type="com.kook.struts.action.IndexAction"?/>
          22???</action-mappings>

          /form/index.jsp的主要內(nèi)容為:
          1?????????<html:javascript?formName="DVForm"/>
          2?????????<html:form?action="/index"?onsubmit="return?validateDVForm(this)">

          <
          html:javascript?formName = " DVForm " />的formName屬性對應(yīng)的是進行驗證的ActionForm的name屬性。onsubmit="return?validateDVForm(this)"為固定寫法,格式為:onsubmit="return?validateXXX(this)",XXX為Form的name屬性,其中首字母大寫就可以了。

          實驗二: 由ValidatorForm的子類VForm來驗證

          他的配置信息只需要將實驗一中底色為黃色高亮部分的DVForm換成VForm就可以了,他們的區(qū)別只在于一個是動態(tài)的,一個是非動態(tài)的。


          實驗三:由DynaValidatorActionForm的子類DVAForm來驗證

          該實驗的配置信息只需要將實驗一struts-config.xml中底色為黃色高亮部分的DVForm換成DVAForm就可以了,其次是修改validation.xml的內(nèi)容,具體如下:

          1?<form-validation>????
          2?????<formset>
          3?????????<form?name="/index">
          4?????????????<field?property="name"?depends="required">
          5?????????????????<arg0?name="required"?key="lable.name"/>
          6?????????????</field>
          7?????????</form>
          8?????</formset>
          9?</form-validation>

          區(qū)別是<form?name="/index">中的name屬性不再對應(yīng)的是驗證Form的name屬性,而是其相對的action類的path屬性

          實驗四:由ValidatorActionForm的子類VAForm來驗證

          與實驗三一樣,換掉struts-config.xml中底色為黃色高亮部分的DVAForm換成VAForm就可以了,validation.xml文件中的內(nèi)容與實驗三保持一致,<form?name="/index">中的name屬性不再對應(yīng)的是驗證Form的name屬性,而是其相對的action類的path屬性。

          不過用DynaValidatorActionForm和ValidatorActionForm的時候好象不能使用客戶端驗證,只能使用服務(wù)器端驗證。還得有高手指點,因此前臺JSP頁面得改成:

          1?????????<html:form?action="/index">
          2?????????????name?:?<html:text?property="name"/><html:errors?property="name"/><br/>
          3?????????????<html:submit/>
          4?????????</html:form>

          下面來介紹一下validation.xml文件中的一些元素信息:

          1、<global>中定義的<constant>和<formset>中定義的<constant>
          前者表示在全局范圍內(nèi)定義常量,可以在validation.xml文件中的其他<formset>中訪問。訪問格式為${constantName}
          后者表示局部的常量定義,只能在聲明他的<formset>中使用。

          2、<field>元素中的幾個子元素:
          <!ELEMENT field (msg|arg|arg0|arg1|arg2|arg3|var)*>
          也就是說他的所有子元素都可以是0-n個,這一點和孫衛(wèi)琴的書有出入,以此為準。

          msg元素
          <msg name="" key="" bundle="" resource=""/>

          name:表示驗證規(guī)則的邏輯名;
          key:對應(yīng)資源文件中的key;
          bundle:指定從哪個資源文件獲取key值,缺省時為默認的資源文件;
          resource:為true是表示從資源文件中獲取key屬性對應(yīng)的信息,為false時表示直接顯示key屬性的內(nèi)容,和資源文件無關(guān)。缺省為true。

          Strust框架中指定了一些常用規(guī)則的對應(yīng)文本,驗證框架默認是從這些對應(yīng)的文本中讀取信息。但是我們可以通過指定msg元素來從自定義的資源文件或者是key中來獲取消息。

          arg.....元素用來指定復(fù)合文本中的參數(shù),依次對應(yīng)。他們的屬性和msg的屬性很相似,用法也是一樣的。

          var元素
          ?1?????<formset>
          ?2?????????<form?name="/index">
          ?3?????????????<field?property="name"?depends="required">
          ?4?????????????????<arg0?name="required"?key="${var:required}"?resource="false"/>
          ?5?????????????????<var>
          ?6?????????????????????<var-name>required</var-name>
          ?7?????????????????????<var-value>xx</var-value>
          ?8?????????????????</var>
          ?9?????????????</field>
          10?????????</form>
          11?????</formset>


          如果執(zhí)行了該驗證的話,輸出的結(jié)果為:xx is required.







          評論

          # re: Validator驗證框架  回復(fù)  更多評論   

          2015-01-23 10:00 by 阿桑地方
          阿桑地方

          # re: Validator驗證框架  回復(fù)  更多評論   

          2015-07-14 19:15 by 13
          12313123131
          主站蜘蛛池模板: 阳泉市| 永年县| 凤山市| 嵩明县| 湖南省| 乌什县| 长汀县| 黔西| 河间市| 四子王旗| 辽源市| 桦川县| 长子县| 疏勒县| 靖安县| 开阳县| 昆山市| 蓬安县| 沙洋县| 安泽县| 息烽县| 天气| 南漳县| 讷河市| 东台市| 平远县| 马关县| 安国市| 伊春市| 锦州市| 安溪县| 盐城市| 洛宁县| 封丘县| 蒙阴县| 玉环县| 同江市| 阿图什市| 都兰县| 紫金县| 山西省|