1. 代碼形式實現(xiàn)輸入校驗
1.1. struts2執(zhí)行流程
客戶端向服務(wù)端發(fā)送HTTP請求
Struts2框架通過StrutsPrepareAndExecuteFilter攔截請求
然后掃描struts.xml文件井厌,找到并實例化該請求所對應(yīng)的Action
對于HTTP請求的參數(shù)值進行類型轉(zhuǎn)換以適配于Action中對應(yīng)的屬性類型(內(nèi)建的類型轉(zhuǎn)換器以及自定義的類型轉(zhuǎn)換器在此時起作用)
類型轉(zhuǎn)換成功的就自動進行賦值碴巾,類型轉(zhuǎn)換失敗的則不進行賦值(Action會以成員變量默認值為最終值)褪尝,并且將錯誤信息寫入到FieldError中
執(zhí)行validate()校驗方法
validate()校驗方法執(zhí)行完后,如果發(fā)現(xiàn)存在錯誤不管是Action級別的還是Field級別的铃拇,那么都會直接跳轉(zhuǎn)到該Action所對應(yīng)的input視圖中
如果沒有存在錯誤溪王,那么會執(zhí)行execute方法磅叛,并跳轉(zhuǎn)到對應(yīng)的視圖來顯示結(jié)果
1.2. ActionError與FieldError底層實現(xiàn)
ActionError底層是通過ArrayList<String>來實現(xiàn)的
FieldError底層是通過LinkedHashMap<String, List<String>>來實現(xiàn)的
1.3. clearErrors()方法的作用
在validate()校驗方法中執(zhí)行該方法抽高,可以將Action級別以及Field級別中的錯誤進行清除,這樣可以讓執(zhí)行流程轉(zhuǎn)向execute而不是跳轉(zhuǎn)到input所對應(yīng)的視圖
1.4. 自定義類型轉(zhuǎn)換錯誤信息
當(dāng)類型轉(zhuǎn)換出錯的時候跛梗,struts2框架會向Field級別中添加錯誤信息寻馏,這些信息通常不符合我們的品味,因此我們需要自定義它
類型轉(zhuǎn)換錯誤信息自定義方法:
在關(guān)聯(lián)的Action包下新建一個配置文件核偿,命名規(guī)則為Action.properties诚欠,內(nèi)容為invalid.fieldvalue.字段名=自定義錯誤描述,例如:
invalid.fieldvalue.age=age invalid!
1.5. struts2標(biāo)簽庫之表單使用
使用struts2提供的表單標(biāo)簽的話默認是post提交方式漾岳,傳統(tǒng)的html表單默認是get提交方式
struts2提供的表單標(biāo)簽轰绵,默認支持回顯功能,這可以大大減輕開發(fā)者的工作
struts2提供的表單標(biāo)簽中有一個重要屬性theme尼荆,該屬性通常設(shè)置為simple左腔,這樣struts2在后臺幫我們生成的html代碼就會比較干凈,不會附帶其它的td等html標(biāo)記捅儒,并且不會將Field級別的錯誤信息自動顯示出來
如果沒有設(shè)置theme屬性值的話液样,那么最終生成的html代碼會比較復(fù)雜,并且會自動將Field級別的錯誤顯示出來
顯示action級別的錯誤信息的struts2標(biāo)簽為:<s:actionerror/>
顯示field級別的錯誤信息的struts2標(biāo)簽為:<s:fielderror></s:fielderror>
具體使用情況可以參考如下代碼:
1.6. ActionError與FieldError差異
Action級別的錯誤信息巧还,通常是我們手動添加的鞭莽,而Field級別的錯誤信息,有可能是我們手工加的麸祷,也有可能是框架在類型轉(zhuǎn)換失敗之后所添加的
2. 配置文件方式實現(xiàn)輸入校驗
2.1. struts2校驗框架簡介
struts2的校驗框架是一個有效的xml文件撮抓,存放在與對應(yīng)的Action同包下,命名規(guī)則為ActionName-validation.xml
摇锋,它采用DTD來驗證,它可以分為字段優(yōu)先校驗器與校驗器優(yōu)先校驗器站超,為什么校驗器分為字段優(yōu)先與校驗器優(yōu)先兩種呢荸恕?這是因為DTD中是如下聲明元素的<!ELEMENT validators (field|validator)+>
,校驗功能最初由xwork提供
2.2. 字段優(yōu)先校驗器實現(xiàn)步驟
- 在對應(yīng)的Action包下新建一個xml文件死相,命名為對應(yīng)的ActionName-validation.xml (如果不知道xml的dtd融求,那么可以在struts2給我們提供的apps下的項目中去找,有了dtd就知道如何去編寫對應(yīng)的元素了)
- 根據(jù)自己的校驗規(guī)則編寫xml算撮,例如下圖所示:
我們要知道一點生宛,所謂的校驗框架校驗其實底層還是用代碼來校驗的县昂,校驗框架中field-validator元素的屬性type值是從default.xml中選取的(default.xml位于com.opensymphony.xwork2.validator.validators包下),如下:
其實對應(yīng)的是一個個的java類陷舅,由這些java類最終來校驗的倒彰,field-validator下的子元素param,其實配置的是這些java類對應(yīng)的setXXX方法罷了
Tips: 對于stringlength而言莱睁,只有當(dāng)值不為null且不為空格的情況下才會進行校驗
2.3. 校驗框架之國際化
struts2支持國際化待讳,底層還是使用了JDK給我們提供的國際化API
實現(xiàn)步驟:
- 在校驗文件(xml)中,對message元素的屬性key指定一個通用的值仰剿,例如:
- 在對應(yīng)的Action包下创淡,創(chuàng)建語言包(資源文件),這些資源文件的命名規(guī)則為package_語言名_國家名.properties南吮,例如:
- 在各自的資源文件中設(shè)置好key-value琳彩,key為message中自定義的key,value為對應(yīng)語言的value部凑,例如:
這樣當(dāng)瀏覽器將英文作為首選語言并發(fā)送請求的時候露乏,會返回"username can't be blank",若以中文作為首選語言砚尽,那么會返回"用戶不能為空"
2.4. 校驗器優(yōu)先校驗器實現(xiàn)步驟
在對應(yīng)的Action包下新建一個xml文件施无,命名為對應(yīng)的ActionName-validation.xml (如果不知道xml的dtd,那么可以在struts2給我們提供的apps下的項目中去找必孤,有了dtd就知道如何去編寫對應(yīng)的元素了)
根據(jù)自己的校驗規(guī)則編寫xml猾骡,例如下圖所示:
validators根元素下用過了validator元素而不是Field元素,這就是所謂的校驗器優(yōu)先校驗器
字段優(yōu)先校驗器是以字段作為基準(zhǔn)的敷搪,而校驗器優(yōu)先校驗器是以校驗器作為基準(zhǔn)的
根據(jù)DTD的規(guī)則兴想,我們可以混用這兩種校驗器,但是不推薦這么做赡勘,應(yīng)該保持一致性
2.5. 代碼校驗方法與校驗框架校驗之間的執(zhí)行順序
進過Debug測試嫂便,struts2是先用校驗框架進行校驗,然后再執(zhí)行自定義調(diào)用方法的校驗方法闸与,接著再執(zhí)行validate方法毙替,執(zhí)行完之后如果在Action級別或Field級別中存在錯誤的話,那么就會跳轉(zhuǎn)到input視圖践樱,否則的話就會去執(zhí)行自定義調(diào)用方法厂画,這個流程是把自定義調(diào)用方法考慮進去的,如果沒有設(shè)置自定義調(diào)用方法的話拷邢,那么相關(guān)的方法調(diào)用都會被忽略
2.6. 小結(jié)
相對于校驗框架而言袱院,手寫validate方式更加靈活,畢竟是用程序控制,限制沒xml那么多忽洛,但為了看懂別人的程序腻惠,校驗框架我們還是需要掌握的
3. 總結(jié)
感覺struts2在類型轉(zhuǎn)換和校驗器這一塊投入了很多精力,但是對于開發(fā)者而言用起來還是很勉強欲虚,太多的配置文件集灌、太多的命名約定,對于我這種懶人不太友好
4. 引用
<<張龍J2EE視頻>>