前天學(xué)習(xí)了struts的編程式驗(yàn)證,今天學(xué)習(xí)struts內(nèi)置的配置式的驗(yàn)證方式,那么,為什么要用這種方式來驗(yàn)證呢?
其實(shí),我們會(huì)發(fā)現(xiàn)struts的編碼方式驗(yàn)證呢會(huì)有一些缺點(diǎn),第一就是不夠靈活,第二是將驗(yàn)證和驗(yàn)證規(guī)則耦合在一起了,還違反了開閉原則,當(dāng)我們使用了struts的validate驗(yàn)證框架的時(shí)候會(huì)發(fā)現(xiàn)使用起來靈活的多,如果添加新的屬性,只需要增加配置文件的屬性驗(yàn)證就行了。
Validate驗(yàn)證框架
首先,我們需要做一些準(zhǔn)備工作:
Validator框架依賴包:
1)jakarta-oro.jar:文本處理類,文本的替換,分割和過濾
2)commons-validator.jar:包含一些通用的驗(yàn)證規(guī)則
需要的配置文件:
1)validator-rules.xml:包含通用驗(yàn)證規(guī)則
2)validation.xml:針對(duì)具體Struts應(yīng)用驗(yàn)證規(guī)則
了解validator-rules.xml:
1)name:驗(yàn)證規(guī)則名稱
2)classname:處理類的權(quán)限類型
3)method:實(shí)現(xiàn)驗(yàn)證規(guī)則方法
3)methodParams:實(shí)現(xiàn)驗(yàn)證規(guī)則方法的參數(shù)列表
4)msg:消息資源文件的key
5)depends:依賴驗(yàn)證規(guī)則
使用validate驗(yàn)證框架的步驟:
1.先在struts-config.xml文件里面加入插件信息
2.修改formbean的繼承為ValidatorForm
3.編寫validator.xml,它的驗(yàn)證規(guī)則跟validator-rules.xml的dtd是一樣的
4.編寫國際化資源文件
5.最后在頁面上顯示錯(cuò)誤信息
好了,我們現(xiàn)在按照這種步驟來做!
第一步,先在struts-config.xml里面加入插件信息,示例代碼:
- <struts-config>
- <data-sources />
- <form-beans>
- <form-bean name="login" type="com.lovo.form.LoginForm"></form-bean>
- </form-beans>
- <global-exceptions />
- <global-forwards />
- <action-mappings>
- <action path="/login" type="com.lovo.action.LoginAction" name="login" validate="true" input="/login.jsp">
- <forward name="success" path="/index.jsp"></forward>
- <forward name="error" path="/login.jsp"></forward>
- </action>
- </action-mappings>
- <message-resources parameter="com.lovo.struts.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>
第二步,這里必須將插件信息加在mappings后面,還有action的validate屬性必須配置哦!input當(dāng)然也要了!這樣才會(huì)去調(diào)用驗(yàn)證框架。然后呢,修改formbean對(duì)象繼承為ValidatorForm這類,示例:
- public class LoginForm extends ValidatorForm {
- private String name;
- private String pwd;
- 正如你看到的,這個(gè)類里面沒有validate方法,但是系統(tǒng)還是會(huì)去調(diào)用驗(yàn)證框架的。
第三步,編寫varlidator.xml文件,這個(gè)文件因?yàn)槭窃诩尤氩寮臅r(shí)候就已經(jīng)把名字給定義了,所以,這里我們還是以validator.xml這個(gè)文件為例,它呢,保存在WEB-INF下面的,因?yàn)樗膁td跟varlidator-rules.xml這個(gè)dtd是一樣的,所以就直接拷貝了??词纠桑?/p>
- <!DOCTYPE form-validation PUBLIC
- "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
- "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
-
- <form-validation>
- <formset>
- <form name="login"><!-- 要驗(yàn)證的formbean的name,這里跟struts-config.xml里面的formbean的name一致 -->
- <!-- property是指要驗(yàn)證的具體屬性名,這里跟formbean里面的屬性名一致
- depends是指驗(yàn)證規(guī)則具體參考validator-rules.xml里面的name對(duì)應(yīng)這里對(duì)非空和最小值和最大值做了驗(yàn)證,多個(gè)驗(yàn)證規(guī)則用,號(hào)隔開,
- -->
- <field property="name" depends="required,minlength,maxlength">
- <arg0 key="login.name"/><!-- 這里是指第0個(gè)占位符(形參)的key是login.name,根據(jù)這個(gè)會(huì)去資源文件里面找login.name所對(duì)應(yīng)的value值,然后將其填充到占位符中 -->
- <arg1 key="${var:minlength}" resource="false"/><!-- 這里key是指第2個(gè)形參的的值對(duì)應(yīng)下面var的name值,首先resource=false是指將不會(huì)去資源文件里面找形參了,而會(huì)在當(dāng)前文件里面找,這里我們會(huì)配置一個(gè)var的屬性來確定第二個(gè)形參的值 -->
- <arg2 key="${var:maxlength}" resource="false"/>
- <var>
- <var-name>minlength</var-name><!-- 這里的var-name是指validator-rules.xml的name -->
- <var-value>2</var-value><!-- 形參的值 -->
- </var>
- <var>
- <var-name>maxlength</var-name>
- <var-value>10</var-value>
- </var>
- </field>
- </form>
- </formset>
- </form-validation>
具體的地方都加了注釋,這里不再詳說。
第四步,編寫國際化資源文件,剛剛在varlidator.xml里面多次提到了國際化文件,那么這個(gè)文件到底有什么作用呢?大家可以跟我來看看哈!ComeON!
errors.required={0}\u4E0D\u80FD\u4E3A\u7A7A\uFF01
errors.minlength={0}\u6700\u5C0F\u4E3A\u6570{1}
errors.maxlength={0}\u6700\u5927\u4F4D\u6570{2}
login.name=\u7528\u6237\u540D
login.pwd=\u5BC6\u7801
這里呢,errors.required這個(gè)key值其實(shí)是varlidator-rules.xml里面的msg對(duì)應(yīng),后面的value值是指要顯示的錯(cuò)誤信息,{0}是指validator.xml里面的arg第幾個(gè)如果是arg0,就是{0},這樣來填充占位符,其實(shí),這里我們也可以把這里的{0}想成我們?cè)趯W(xué)JDBC的時(shí)候,里面的preparedstatments里面的填充?號(hào)的值,其實(shí)是一個(gè)道理。
最后的login.name是指要填充的具體內(nèi)容,它跟varlidator.xml里面的arg幾的具體參數(shù)為準(zhǔn),一般都是resource="true"的時(shí)候才來這里面讀取,因?yàn)檫@里我是使用utf-8的格式,所以看起來有點(diǎn)看不懂,其實(shí)就是中文。
第五步,顯示錯(cuò)誤信息,示例代碼:
顯示錯(cuò)誤信息,跟前天的顯示是一樣的,具體請(qǐng)參看前天的博客內(nèi)容,這里稍微提下,就是html-errors里面的property的值為validator.xml里面的field的name值,也就是屬性名!
最后是struts的標(biāo)簽庫,個(gè)人認(rèn)為這個(gè)東西用的不多,但是還是要掌握!
struts-html主要替換原來的html標(biāo)簽
struts-bean 主要是用于輸出國際化資源文件,重要的是writer和message還有一點(diǎn)就是創(chuàng)建和復(fù)制define
struts-logic主要用于邏輯判斷控制流程Internet 和 equal 循環(huán)和比較
struts-tiles 主要是為了創(chuàng)建網(wǎng)頁模板感覺用處不大
好了先總結(jié)到此!