Struts1.2中創(chuàng)建驗(yàn)證框架的步驟:
1、在struts-config.xml文件中添加下列內(nèi)容:
注意:這些內(nèi)容必須放在<message-resources>元素之后。該規(guī)則是由
" http://struts.apache.org/dtds/struts-config_1_2.dtd "文件制定的。
2、創(chuàng)建相關(guān)的組件:
為了實(shí)驗(yàn)的目的,我依次創(chuàng)建4個(gè)ActionForm類,一個(gè)JSP,一個(gè)Action類,以下是他們?cè)趕truts-config.xml中的配置信息:
其中
<form-bean name="VForm" type="com.kook.struts.form.HahaForm" />是ValidatorForm類的子類
<form-bean name="VAForm" type="com.kook.struts.form.HohoForm" />是ValidatorActionForm類的子類
下面是JSP頁(yè)面代碼:
因?yàn)橹皇亲霰韱悟?yàn)證,action類可以不用涉及,因此不列出action類的代碼啦!
3、刪除name="VForm" 和name="VAForm"的ActionForm中的validate方法。
因?yàn)檫@兩個(gè)類不是動(dòng)態(tài)的驗(yàn)證類,在使用向?qū)纱a的時(shí)候會(huì)自動(dòng)覆蓋父類的validate方法。如果不刪除的話,根據(jù)類的多態(tài)性原理,會(huì)調(diào)用他們生成的validate方法,而不調(diào)用他們父類的該方法。但是,實(shí)際上,是他們父類的validate方法調(diào)用了validator框架的驗(yàn)證方法,因此我們沒(méi)有必要再去重寫他的這個(gè)方法。同時(shí)也要記得刪除,因?yàn)橄驅(qū)傻氖强諏?shí)現(xiàn),不刪除的話,起不到驗(yàn)證作用。切記切記!!!曾經(jīng)在這吃啊擔(dān)子滴!!
觀察以上代碼不難發(fā)現(xiàn),表單中只有一個(gè)文本框,因此實(shí)驗(yàn)也是對(duì)這個(gè)文本框進(jìn)行驗(yàn)證。
4、創(chuàng)建自定義的驗(yàn)證文件validation.xml,主要內(nèi)容如下所示:
其中key="lable.name "在資源文件中對(duì)應(yīng)的內(nèi)容為:lable.name=name,因此,當(dāng)文本框中沒(méi)有輸入任何信息而提交的時(shí)候,將會(huì)反饋一條name is required.的信息。
下面開始實(shí)驗(yàn),
實(shí)驗(yàn)的目的是:依次使用4種驗(yàn)證Form來(lái)實(shí)現(xiàn)表單的驗(yàn)證功能,
他們分別是:DynaValidatorForm,DynaValidatorActionForm,ValidatorForm,ValidatorActionForm。這也是前面為什么要?jiǎng)?chuàng)建4個(gè)ActionForm的目的,詳細(xì)配置信息見前面struts-config.xml
而JSP頁(yè)面只有一個(gè),就是配置文件中的input="/form/index.jsp "
實(shí)驗(yàn)一:由DynaValidatorForm的子類DVForm來(lái)驗(yàn)證

validation.xml的內(nèi)容為:
struts-config.xml的內(nèi)容為:
/form/index.jsp的主要內(nèi)容為:
< html:javascript?formName = " DVForm " />的formName屬性對(duì)應(yīng)的是進(jìn)行驗(yàn)證的ActionForm的name屬性。onsubmit="return?validateDVForm(this)"為固定寫法,格式為:onsubmit="return?validateXXX(this)",XXX為Form的name屬性,其中首字母大寫就可以了。
實(shí)驗(yàn)二: 由ValidatorForm的子類VForm來(lái)驗(yàn)證
他的配置信息只需要將實(shí)驗(yàn)一中底色為黃色高亮部分的DVForm換成VForm就可以了,他們的區(qū)別只在于一個(gè)是動(dòng)態(tài)的,一個(gè)是非動(dòng)態(tài)的。
實(shí)驗(yàn)三:由DynaValidatorActionForm的子類DVAForm來(lái)驗(yàn)證
該實(shí)驗(yàn)的配置信息只需要將實(shí)驗(yàn)一struts-config.xml中底色為黃色高亮部分的DVForm換成DVAForm就可以了,其次是修改validation.xml的內(nèi)容,具體如下:
區(qū)別是<form?name="/index">中的name屬性不再對(duì)應(yīng)的是驗(yàn)證Form的name屬性,而是其相對(duì)的action類的path屬性
實(shí)驗(yàn)四:由ValidatorActionForm的子類VAForm來(lái)驗(yàn)證
與實(shí)驗(yàn)三一樣,換掉struts-config.xml中底色為黃色高亮部分的DVAForm換成VAForm就可以了,validation.xml文件中的內(nèi)容與實(shí)驗(yàn)三保持一致,<form?name="/index">中的name屬性不再對(duì)應(yīng)的是驗(yàn)證Form的name屬性,而是其相對(duì)的action類的path屬性。
不過(guò)用DynaValidatorActionForm和ValidatorActionForm的時(shí)候好象不能使用客戶端驗(yàn)證,只能使用服務(wù)器端驗(yàn)證。還得有高手指點(diǎn),因此前臺(tái)JSP頁(yè)面得改成:
下面來(lái)介紹一下validation.xml文件中的一些元素信息:
1、<global>中定義的<constant>和<formset>中定義的<constant>
前者表示在全局范圍內(nèi)定義常量,可以在validation.xml文件中的其他<formset>中訪問(wèn)。訪問(wèn)格式為${constantName}
后者表示局部的常量定義,只能在聲明他的<formset>中使用。
2、<field>元素中的幾個(gè)子元素:
<!ELEMENT field (msg|arg|arg0|arg1|arg2|arg3|var)*>
也就是說(shuō)他的所有子元素都可以是0-n個(gè),這一點(diǎn)和孫衛(wèi)琴的書有出入,以此為準(zhǔn)。
msg元素
<msg name="" key="" bundle="" resource=""/>
name:表示驗(yàn)證規(guī)則的邏輯名;
key:對(duì)應(yīng)資源文件中的key;
bundle:指定從哪個(gè)資源文件獲取key值,缺省時(shí)為默認(rèn)的資源文件;
resource:為true是表示從資源文件中獲取key屬性對(duì)應(yīng)的信息,為false時(shí)表示直接顯示key屬性的內(nèi)容,和資源文件無(wú)關(guān)。缺省為true。
Strust框架中指定了一些常用規(guī)則的對(duì)應(yīng)文本,驗(yàn)證框架默認(rèn)是從這些對(duì)應(yīng)的文本中讀取信息。但是我們可以通過(guò)指定msg元素來(lái)從自定義的資源文件或者是key中來(lái)獲取消息。
arg.....元素用來(lái)指定復(fù)合文本中的參數(shù),依次對(duì)應(yīng)。他們的屬性和msg的屬性很相似,用法也是一樣的。
var元素
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 >
???????? < 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)的組件:
為了實(shí)驗(yàn)的目的,我依次創(chuàng)建4個(gè)ActionForm類,一個(gè)JSP,一個(gè)Action類,以下是他們?cè)趕truts-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>
?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頁(yè)面代碼:
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"/>
2?????????????name?:?<html:text?property="name"/><html:errors?property="name"/><br/>
3?????????????<html:submit/>
4??</html:form>
5??<html:javascript?formName="DVForm"/>
因?yàn)橹皇亲霰韱悟?yàn)證,action類可以不用涉及,因此不列出action類的代碼啦!
3、刪除name="VForm" 和name="VAForm"的ActionForm中的validate方法。
因?yàn)檫@兩個(gè)類不是動(dòng)態(tài)的驗(yàn)證類,在使用向?qū)纱a的時(shí)候會(huì)自動(dòng)覆蓋父類的validate方法。如果不刪除的話,根據(jù)類的多態(tài)性原理,會(huì)調(diào)用他們生成的validate方法,而不調(diào)用他們父類的該方法。但是,實(shí)際上,是他們父類的validate方法調(diào)用了validator框架的驗(yàn)證方法,因此我們沒(méi)有必要再去重寫他的這個(gè)方法。同時(shí)也要記得刪除,因?yàn)橄驅(qū)傻氖强諏?shí)現(xiàn),不刪除的話,起不到驗(yàn)證作用。切記切記!!!曾經(jīng)在這吃啊擔(dān)子滴!!
觀察以上代碼不難發(fā)現(xiàn),表單中只有一個(gè)文本框,因此實(shí)驗(yàn)也是對(duì)這個(gè)文本框進(jìn)行驗(yàn)證。
4、創(chuàng)建自定義的驗(yàn)證文件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>
?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 "在資源文件中對(duì)應(yīng)的內(nèi)容為:lable.name=name,因此,當(dāng)文本框中沒(méi)有輸入任何信息而提交的時(shí)候,將會(huì)反饋一條name is required.的信息。
下面開始實(shí)驗(yàn),
實(shí)驗(yàn)的目的是:依次使用4種驗(yàn)證Form來(lái)實(shí)現(xiàn)表單的驗(yàn)證功能,
他們分別是:DynaValidatorForm,DynaValidatorActionForm,ValidatorForm,ValidatorActionForm。這也是前面為什么要?jiǎng)?chuàng)建4個(gè)ActionForm的目的,詳細(xì)配置信息見前面struts-config.xml
而JSP頁(yè)面只有一個(gè),就是配置文件中的input="/form/index.jsp "
實(shí)驗(yàn)一:由DynaValidatorForm的子類DVForm來(lái)驗(yàn)證

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>
?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>
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)">
2?????????<html:form?action="/index"?onsubmit="return?validateDVForm(this)">
< html:javascript?formName = " DVForm " />的formName屬性對(duì)應(yīng)的是進(jìn)行驗(yàn)證的ActionForm的name屬性。onsubmit="return?validateDVForm(this)"為固定寫法,格式為:onsubmit="return?validateXXX(this)",XXX為Form的name屬性,其中首字母大寫就可以了。
實(shí)驗(yàn)二: 由ValidatorForm的子類VForm來(lái)驗(yàn)證
他的配置信息只需要將實(shí)驗(yàn)一中底色為黃色高亮部分的DVForm換成VForm就可以了,他們的區(qū)別只在于一個(gè)是動(dòng)態(tài)的,一個(gè)是非動(dòng)態(tài)的。
實(shí)驗(yàn)三:由DynaValidatorActionForm的子類DVAForm來(lái)驗(yàn)證
該實(shí)驗(yàn)的配置信息只需要將實(shí)驗(yàn)一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>
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屬性不再對(duì)應(yīng)的是驗(yàn)證Form的name屬性,而是其相對(duì)的action類的path屬性
實(shí)驗(yàn)四:由ValidatorActionForm的子類VAForm來(lái)驗(yàn)證
與實(shí)驗(yàn)三一樣,換掉struts-config.xml中底色為黃色高亮部分的DVAForm換成VAForm就可以了,validation.xml文件中的內(nèi)容與實(shí)驗(yàn)三保持一致,<form?name="/index">中的name屬性不再對(duì)應(yīng)的是驗(yàn)證Form的name屬性,而是其相對(duì)的action類的path屬性。
不過(guò)用DynaValidatorActionForm和ValidatorActionForm的時(shí)候好象不能使用客戶端驗(yàn)證,只能使用服務(wù)器端驗(yàn)證。還得有高手指點(diǎn),因此前臺(tái)JSP頁(yè)面得改成:
1?????????<html:form?action="/index">
2?????????????name?:?<html:text?property="name"/><html:errors?property="name"/><br/>
3?????????????<html:submit/>
4?????????</html:form>
2?????????????name?:?<html:text?property="name"/><html:errors?property="name"/><br/>
3?????????????<html:submit/>
4?????????</html:form>
下面來(lái)介紹一下validation.xml文件中的一些元素信息:
1、<global>中定義的<constant>和<formset>中定義的<constant>
前者表示在全局范圍內(nèi)定義常量,可以在validation.xml文件中的其他<formset>中訪問(wèn)。訪問(wèn)格式為${constantName}
后者表示局部的常量定義,只能在聲明他的<formset>中使用。
2、<field>元素中的幾個(gè)子元素:
<!ELEMENT field (msg|arg|arg0|arg1|arg2|arg3|var)*>
也就是說(shuō)他的所有子元素都可以是0-n個(gè),這一點(diǎn)和孫衛(wèi)琴的書有出入,以此為準(zhǔn)。
msg元素
<msg name="" key="" bundle="" resource=""/>
name:表示驗(yàn)證規(guī)則的邏輯名;
key:對(duì)應(yīng)資源文件中的key;
bundle:指定從哪個(gè)資源文件獲取key值,缺省時(shí)為默認(rèn)的資源文件;
resource:為true是表示從資源文件中獲取key屬性對(duì)應(yīng)的信息,為false時(shí)表示直接顯示key屬性的內(nèi)容,和資源文件無(wú)關(guān)。缺省為true。
Strust框架中指定了一些常用規(guī)則的對(duì)應(yīng)文本,驗(yàn)證框架默認(rèn)是從這些對(duì)應(yīng)的文本中讀取信息。但是我們可以通過(guò)指定msg元素來(lái)從自定義的資源文件或者是key中來(lái)獲取消息。
arg.....元素用來(lái)指定復(fù)合文本中的參數(shù),依次對(duì)應(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>
?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í)行了該驗(yàn)證的話,輸出的結(jié)果為:xx is required.