第16章struts2高級應(yīng)用_第1頁
第16章struts2高級應(yīng)用_第2頁
第16章struts2高級應(yīng)用_第3頁
第16章struts2高級應(yīng)用_第4頁
第16章struts2高級應(yīng)用_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第16章Struts2高級應(yīng)用

本章將介紹Struts2框架內(nèi)建的類型轉(zhuǎn)換器,如基本數(shù)據(jù)類型轉(zhuǎn)換器、數(shù)組類型轉(zhuǎn)換器及集合轉(zhuǎn)換器。還將詳細(xì)介紹服務(wù)器端校驗(yàn)并介紹使用校驗(yàn)框架來完成輸入校驗(yàn)。通過本章的學(xué)習(xí),讀者應(yīng)該能夠完成如下幾個目標(biāo)。熟練使用Struts2內(nèi)建的類型轉(zhuǎn)換器理解服務(wù)器端校驗(yàn)的重要性熟練使用addFieldError來添加校驗(yàn)錯誤信息熟練使用Struts2校驗(yàn)框架完成輸入校驗(yàn)16.1Struts2內(nèi)建的類型轉(zhuǎn)換器 Struts2為常用的數(shù)據(jù)類型提供了內(nèi)建的類型轉(zhuǎn)換器,所以根本不用自定義轉(zhuǎn)換器。對于內(nèi)建的轉(zhuǎn)換器,Struts在遇到這些類型時,會自動去調(diào)用相應(yīng)的轉(zhuǎn)換器進(jìn)行類型轉(zhuǎn)換。下面來看Struts2提供了哪些內(nèi)建的類型轉(zhuǎn)換器,以及這些內(nèi)建類型轉(zhuǎn)換器的使用。16.1.1內(nèi)建轉(zhuǎn)換器介紹Struts2為常用的數(shù)據(jù)類型提供了內(nèi)建的類型轉(zhuǎn)換器,大部分情況下可以不用自定義轉(zhuǎn)換器。對于內(nèi)建的轉(zhuǎn)換器,Struts在遇到這些類型時,會自動去調(diào)用相應(yīng)的轉(zhuǎn)換器。下面列舉了全部的內(nèi)建轉(zhuǎn)換器:基本數(shù)據(jù)類型轉(zhuǎn)換器基本數(shù)據(jù)類型的封裝類轉(zhuǎn)換器數(shù)組類型轉(zhuǎn)換器集合類型轉(zhuǎn)換器16.1.2基本數(shù)據(jù)類型轉(zhuǎn)換器Struts2的內(nèi)建轉(zhuǎn)換器中包含一個基本數(shù)據(jù)類型轉(zhuǎn)換器,通過它能自動的完成基本數(shù)據(jù)類型到字符串的轉(zhuǎn)換。16.1.3基本數(shù)據(jù)類型的封裝類轉(zhuǎn)換器Struts2不但提供了基本數(shù)據(jù)類型轉(zhuǎn)換器,同時也提供了基本數(shù)據(jù)類型封裝類的轉(zhuǎn)換器。其用法和基本數(shù)據(jù)類型基本一樣,只需修改業(yè)務(wù)控制器中的屬性為對應(yīng)的封裝類就可以了。16.1.4數(shù)組類型轉(zhuǎn)換器Struts2還提供了一個數(shù)組類型的轉(zhuǎn)換器。這個轉(zhuǎn)換器非常有用,比如多個表單元素的name屬性相同,那么提交的參數(shù)就不再是字符串而是一個字符串?dāng)?shù)組。通過Struts2提供的數(shù)組類型的轉(zhuǎn)換器就能很方便的將多個相同name屬性的表單元素的值封裝到Action中的一個數(shù)組中。16.1.5集合類型轉(zhuǎn)換器

上面介紹的是通過字符串?dāng)?shù)組來接受參數(shù)值,同樣也可以通過集合類型來接受參數(shù)值。Struts2提供的集合類型轉(zhuǎn)換器,會將參數(shù)值自動賦值到集合類型屬性中。16.2服務(wù)器端校驗(yàn)

如果一個Web應(yīng)用僅有客戶端驗(yàn)證那是不夠的。攻擊者這可以繞過客戶端校驗(yàn)直接進(jìn)行非法輸入,這樣可能會引起系統(tǒng)的異常,所以必須加上服務(wù)器端的驗(yàn)證。下面來看如何添加服務(wù)器端校驗(yàn)。16.2.1服務(wù)器端校驗(yàn)的重要性

如果為注冊頁面添加了客戶端校驗(yàn),那么用戶輸入的信息不合法則無法提交。這是這里要注意的話,使用JavaScript增加客戶端校驗(yàn)僅僅使得非法的數(shù)據(jù)無法提交,但是一些侵入者完成可以采用其他的方式來進(jìn)行提交。下面來看如何繞過這些JavaScript校驗(yàn)代碼?首先可以直接把這個注冊頁面下載下來,然后通過刪除那些JavaScript代碼,再修改表單的提交地址。這樣的話,就算是輸入不合法的信息,客戶端校驗(yàn)也起不了作用了,因?yàn)檫BJavaScript代碼都被刪除掉了。通過一種如此簡單的方法就可以繞過這些JavaScript校驗(yàn)代碼。那些侵入者很可能使用更加高級的手段來繞過這些JavaScript代碼,從而直接提交非法的數(shù)據(jù)。要避免這種情況就必須添加服務(wù)器端校驗(yàn),服務(wù)端校驗(yàn)是整個Web應(yīng)用中最重要的一道防線。用戶使無法直接接觸到服務(wù)器端代碼的,這樣的話就算是客戶端校驗(yàn)被人繞過,仍然能夠通過服務(wù)器端校驗(yàn)來阻止用戶的非法輸入。服務(wù)器端校驗(yàn)對于系統(tǒng)的安全性、完整性、健壯性起到了至關(guān)重要的作用。16.2.1服務(wù)器端校驗(yàn)的重要性

那是不是客戶端校驗(yàn)根本就沒有什么意義了呢?其實(shí)不是,因?yàn)椴⒉皇敲總€用戶都有這樣惡意侵入的想法。大部分的用戶都是采用的正常的輸入,使用客戶端校驗(yàn)?zāi)軌蜻^濾掉用戶的誤操作。如果沒有客戶端校驗(yàn),那么就算用戶只是一個錯誤的操作,服務(wù)器端就要對其輸入的信息進(jìn)行處理并返回錯誤提示,這樣會大大增加服務(wù)器端的負(fù)載。客戶端校驗(yàn)就像是一把鎖,能夠防君子但是不能防小人。同樣客戶端校驗(yàn)和服務(wù)器端校驗(yàn)是緊密結(jié)合的,兩者缺一不可。16.2.2完成服務(wù)器端輸入校驗(yàn)

下面來完成服務(wù)器端輸入校驗(yàn)。其中包含兩個文件,一個是用戶注冊頁register.jsp,一個是業(yè)務(wù)控制器RegisterAction

。16.2.3使頁面保留提交信息

如果希望表單中能夠保留提交的信息,可以在表單的每個元素中添加value屬性,并通過EL表達(dá)式來獲得相應(yīng)參數(shù)值。16.2.4使用addFieldError來添加錯誤信息

在前面介紹了使用actionError來保存輸入校驗(yàn)錯誤提示信息。actionError其實(shí)就是一個ArrayList,將錯誤信息保存在actionError中,其實(shí)就是保存在一個ArrayList中。前面曾講過類型轉(zhuǎn)換的錯誤信息是保存在fieldError中,同樣輸入校驗(yàn)的錯誤信息也可以通過addFieldError方法來保存到fieldError中。fieldError和actionError不同的是,fieldError是采用Map結(jié)構(gòu)來存儲的,所以都是以鍵值對來保存信息。那到底是使用fieldError來保存錯誤提示信息還是使用actionError好呢?這個就依據(jù)項(xiàng)目具體要求而定了,如果只是希望在頁面中單純的顯示錯誤提示信息,可以使用actionError來保存錯誤提示信息;如果希望在相應(yīng)的文本框中顯示錯誤提示信息,則需要使用fieldError來保存錯誤提示信息。16.2.5輸入校驗(yàn)與類型轉(zhuǎn)換關(guān)系

用戶提交參數(shù)后,首先將會調(diào)用類型轉(zhuǎn)換器來執(zhí)行類型轉(zhuǎn)換。如果類型轉(zhuǎn)換失敗,則會將錯誤信息保存在fieldError中。然后不管類型轉(zhuǎn)換失敗還是成功,都會進(jìn)行輸入校驗(yàn),并將校驗(yàn)錯誤信息保存到fieldError或者actionError中。最后系統(tǒng)判斷fieldError或actionError中是否存在錯誤信息,如果存在錯誤信息,頁面將跳轉(zhuǎn)到input邏輯視圖指定的視圖資源,并在視圖資源中將錯誤信息顯示出來。類型轉(zhuǎn)換和輸入校驗(yàn)的執(zhí)行順序是非常重要的。為什么要先進(jìn)行類型轉(zhuǎn)換呢。因?yàn)椴荒鼙WC用戶輸入的信息符合要求,比如年齡屬性肯定會要求接收一個能夠轉(zhuǎn)換為int類型的字符串。用戶的輸入是自由的,很可能輸入一些無法轉(zhuǎn)換的字符串,所以必須先對用戶輸入的信息進(jìn)行類型轉(zhuǎn)換,然后再將類型轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行輸入校驗(yàn)。如果在年齡文本框中輸入一個“aa”字符串,類型轉(zhuǎn)換肯定會失敗,在fieldError中將保存該類型轉(zhuǎn)換錯誤信息。age屬性的初始值為0,那么在輸入校驗(yàn)中也將提示該錯誤信息。16.3使用校驗(yàn)框架完成輸入校驗(yàn)

前面介紹了Struts2中內(nèi)置的校驗(yàn)器,下面將通過這些校驗(yàn)器來改寫注冊案例。同時將結(jié)合國際化處理來實(shí)現(xiàn)國際化信息提示,并通過配置來添加客戶端校驗(yàn)。16.3.1完成輸入校驗(yàn)Struts2提供了許多的內(nèi)置的校驗(yàn)器,通過這些校驗(yàn)器可以非常方便的添加校驗(yàn)規(guī)則。不需要再使用手動添加校驗(yàn)代碼的方式,而是使用編寫校驗(yàn)規(guī)則文件的方式來進(jìn)行輸入校驗(yàn)。下面來看有哪些輸入校驗(yàn)規(guī)則。(1)用戶名、密碼、確認(rèn)密碼必須輸入。(2)用戶名只能是數(shù)字或者字母,長度為6到20之間。(3)密碼,確認(rèn)密碼必須是數(shù)字或者字母,長度為6到20之間。(4)密碼和確認(rèn)密碼必須相同。(5)年齡必須為整數(shù)而且必須是有效的年齡值。(6)出生日期必須為正確的日期格式如1988-01-03,而且只能是1900-1-1年到是2010-1-1年之間。(7)郵箱地址必須為合法的郵箱地址。16.3.2增加客戶端校驗(yàn)Struts2還提供了一個非常好的功能,就是能通過校驗(yàn)規(guī)則文件自動添加客戶端輸入校驗(yàn)。先來看下如何來添加客戶端校驗(yàn)。非常簡單,只用<s:form>標(biāo)簽中添加validate=“true”屬性即可。16.3.3國際化提示信息

前面介紹的輸出校驗(yàn)錯誤信息,是通過直接在校驗(yàn)規(guī)則文件中添加錯誤提示信息實(shí)現(xiàn)的。其實(shí)可以通過國際化資源文件來定義錯誤信息,而通過校驗(yàn)規(guī)則文件中<message>標(biāo)簽中的key來指定所使用的校驗(yàn)錯誤信息。16.3.4客戶端校驗(yàn)與國際化問題

前面之所以開始要去掉客戶端校驗(yàn)功能。是因?yàn)橥瑫r使用客戶端校驗(yàn)功能和國際化功能會出現(xiàn)異常。可以通過另一種方式來讀取國際化信息。在校驗(yàn)規(guī)則文件中使用${getTest(“key”)}來讀取國際化文件中的信息。

16.3.5校驗(yàn)短路

短路,也就是說一個校驗(yàn)器校驗(yàn)失敗了另一個校驗(yàn)器不會再進(jìn)行校驗(yàn)。要想實(shí)現(xiàn)短路這種效果,只需在field-validtor元素(字段校驗(yàn)器配置風(fēng)格)或者是valitor元素(非字段校驗(yàn)器風(fēng)格)中增加一個short-circuit屬性,并設(shè)置其屬性值為true進(jìn)行了。16.4綜合練習(xí)

編寫校驗(yàn)規(guī)則文件,用戶名、密碼必須

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論