struts2輸入校驗詳解

1. 代碼形式實現(xiàn)輸入校驗

1.1. struts2執(zhí)行流程

  1. 客戶端向服務(wù)端發(fā)送HTTP請求

  2. Struts2框架通過StrutsPrepareAndExecuteFilter攔截請求

  3. 然后掃描struts.xml文件井厌,找到并實例化該請求所對應(yīng)的Action

  4. 對于HTTP請求的參數(shù)值進行類型轉(zhuǎn)換以適配于Action中對應(yīng)的屬性類型(內(nèi)建的類型轉(zhuǎn)換器以及自定義的類型轉(zhuǎn)換器在此時起作用)

  5. 類型轉(zhuǎn)換成功的就自動進行賦值碴巾,類型轉(zhuǎn)換失敗的則不進行賦值(Action會以成員變量默認值為最終值)褪尝,并且將錯誤信息寫入到FieldError中

  6. 執(zhí)行validate()校驗方法

  7. validate()校驗方法執(zhí)行完后,如果發(fā)現(xiàn)存在錯誤不管是Action級別的還是Field級別的铃拇,那么都會直接跳轉(zhuǎn)到該Action所對應(yīng)的input視圖中

  8. 如果沒有存在錯誤溪王,那么會執(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>

具體使用情況可以參考如下代碼:

struts標(biāo)簽庫的使用.png
顯示表單提交結(jié)果.png

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)步驟

  1. 在對應(yīng)的Action包下新建一個xml文件死相,命名為對應(yīng)的ActionName-validation.xml (如果不知道xml的dtd融求,那么可以在struts2給我們提供的apps下的項目中去找,有了dtd就知道如何去編寫對應(yīng)的元素了)
  2. 根據(jù)自己的校驗規(guī)則編寫xml算撮,例如下圖所示:
sruts2字段優(yōu)先校驗.png

我們要知道一點生宛,所謂的校驗框架校驗其實底層還是用代碼來校驗的县昂,校驗框架中field-validator元素的屬性type值是從default.xml中選取的(default.xml位于com.opensymphony.xwork2.validator.validators包下),如下:

default.xml.png

其實對應(yīng)的是一個個的java類陷舅,由這些java類最終來校驗的倒彰,field-validator下的子元素param,其實配置的是這些java類對應(yīng)的setXXX方法罷了

Tips: 對于stringlength而言莱睁,只有當(dāng)值不為null且不為空格的情況下才會進行校驗

2.3. 校驗框架之國際化

struts2支持國際化待讳,底層還是使用了JDK給我們提供的國際化API

實現(xiàn)步驟:

  1. 在校驗文件(xml)中,對message元素的屬性key指定一個通用的值仰剿,例如:
校驗框架之國際化.png
  1. 在對應(yīng)的Action包下创淡,創(chuàng)建語言包(資源文件),這些資源文件的命名規(guī)則為package_語言名_國家名.properties南吮,例如:
語言包.png
  1. 在各自的資源文件中設(shè)置好key-value琳彩,key為message中自定義的key,value為對應(yīng)語言的value部凑,例如:
package_en_US.png
package_zh_CN.properties.png

這樣當(dāng)瀏覽器將英文作為首選語言并發(fā)送請求的時候露乏,會返回"username can't be blank",若以中文作為首選語言砚尽,那么會返回"用戶不能為空"

2.4. 校驗器優(yōu)先校驗器實現(xiàn)步驟

  1. 在對應(yīng)的Action包下新建一個xml文件施无,命名為對應(yīng)的ActionName-validation.xml (如果不知道xml的dtd,那么可以在struts2給我們提供的apps下的項目中去找必孤,有了dtd就知道如何去編寫對應(yīng)的元素了)

  2. 根據(jù)自己的校驗規(guī)則編寫xml猾骡,例如下圖所示:

校驗器優(yōu)先.png

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視頻>>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末苍在,一起剝皮案震驚了整個濱河市绝页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寂恬,老刑警劉巖续誉,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異初肉,居然都是意外死亡酷鸦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門牙咏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼隔,“玉大人,你說我怎么就攤上這事妄壶∷の眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵丁寄,是天一觀的道長氨淌。 經(jīng)常有香客問我,道長伊磺,這世上最難降的妖魔是什么盛正? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮屑埋,結(jié)果婚禮上豪筝,老公的妹妹穿的比我還像新娘。我一直安慰自己摘能,他們只是感情好续崖,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著团搞,像睡著了一般袜刷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莺丑,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼梢莽。 笑死萧豆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昏名。 我是一名探鬼主播涮雷,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轻局!你這毒婦竟也來了洪鸭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仑扑,失蹤者是張志新(化名)和其女友劉穎览爵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镇饮,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蜓竹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了储藐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俱济。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钙勃,靈堂內(nèi)的尸體忽然破棺而出蛛碌,到底是詐尸還是另有隱情,我是刑警寧澤辖源,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布蔚携,位于F島的核電站,受9級特大地震影響同木,放射性物質(zhì)發(fā)生泄漏浮梢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一彤路、第九天 我趴在偏房一處隱蔽的房頂上張望秕硝。 院中可真熱鬧,春花似錦洲尊、人聲如沸远豺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躯护。三九已至,卻和暖如春丽涩,著一層夾襖步出監(jiān)牢的瞬間棺滞,已是汗流浹背裁蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留继准,地道東北人枉证。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像移必,于是被迫代替她去往敵國和親室谚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 標(biāo)簽 如果要配置的標(biāo)簽崔泵,那么必須要先配置標(biāo)簽秒赤,代表的包的概念。 包含的屬性 name包的名稱憎瘸,要求是唯一的入篮,管理a...
    偷偷得路過閱讀 1,344評論 0 0
  • 非本人總結(jié)的筆記,抄點筆記復(fù)習(xí)復(fù)習(xí)含思。感謝傳智博客和黑馬程序猿記筆記啊記筆記 結(jié)果頁面的設(shè)置 在action標(biāo)簽里面...
    鍵盤瞎閱讀 543評論 2 4
  • 詳談 Struts2 的核心概念 本文將深入探討Struts2 的核心概念崎弃,首先介紹的是Struts2 的體系結(jié)構(gòu)...
    可愛傻妞是我的愛閱讀 1,122評論 0 2
  • 一個很莫名其妙的標(biāo)題,很多人看到兩者的差別含潘,也有人會想到兩者的聯(lián)系饲做,而我,釣魚從未入行遏弱,所以一直很有排斥盆均,但卻佩服...
    千里_至閱讀 243評論 0 0