struts2(三) 輸入校驗和攔截器
前面知道了struts2的架構圖和struts2的自動封裝表單參數和數據類型自動轉換,今天來學struts2的第三第四個東西,輸入校驗和攔截器,
--WH
一、輸入校驗
在以前我們寫一個登錄頁面時,並沒有限制用戶的輸入,不管用戶輸入什麽,我們都存入數據庫中,很顯然這是不行的,我們需要檢測用戶輸入的文本是否合法,是否符合我們需要的文本格式,符合菜放行,而struts2中就有這種功能,能幫我們在服務器段進行判斷,比如用戶名不能為空,年齡只能在0-100之間等。現在我們就來說說如何使用struts2中的校驗功能把。
分為兩種,編程式校驗和配置校驗(XML配置校驗)
1.1編程式校驗,
對action中所有方法都執行校驗
實現Validateable接口,重寫其中的validate方法,因為我們的action繼承自actionSupport,actionsupport幫我們實現了這接口,所以我們只需要重寫validate方法即可。
在這裏使用了一個addFieldError("xxx","yyy"); 將錯誤信息存起來,等回到頁面在顯示出來,如何顯示呢?如果使用的是s標簽提交的表單,那麽該會自動顯示出來,如果不是,則需要手動將其輸出,<s:fielderror fieldName="xxx">. 並且如果使用了,addFieldError中存有了信息,則不會在前往原先action所需要跳轉的頁面,而是找到result為input的結果碼對應的頁面。所以,如果需要使用它,那麽在struts.xml中應該編寫一個結果碼為input的代碼。
為什麽需要input結果碼等?原因是這種輸入校驗依靠了兩個攔截器,如圖所示
這種數據檢驗都是在數據進行類型轉換之後做的事情,從圖中的幾個攔截器就可以看先後執行順序,也可以解釋為什麽需要input結果碼了。
對單個方法或指定方法進行數據校驗。
上面這種對所有方法校驗有些不符合我們的要求,因為並不是每個方法都需要提交表單參數過來的,所以struts2中有兩種辦法解決這個問題。
1、還是對所有方法進行校驗,不過可以將我們不需要使用校驗的方法上用註解@SkipValidation進行跳過即可。
2、指定校驗某個方法, 比如validateAdd()這就只校驗add方法, validateLogin() 值校驗login方法,以這樣的格式進行命名,就是對特定方法進行校驗了。
例子就不需要舉了,太簡單了。註意一點,指定某個方法校驗會在公共校驗方法之前被調用,也就是說會先執行validateXXX(),然後在執行validate()方法。
1.2、xml配置校驗。
要求:
1、必須實現validateable接口,actionsupport已經實現了,所以我們只需要直接繼承actionsupport即可
2、action中必須為屬性提供getXXX、setXXX方法,因為代碼校驗是在Action本類中來完成校驗,這說明我們可以直接使用本類的private屬性,但如果使用XML配置方式校驗,這需要使用校驗框架的代碼來完成校驗工作,那麽校驗框架需要調用Action的getXXX()方法來獲取被校驗的屬性,所以一定要為被校驗的屬性提供getXXX()方法
創建校驗配置文件
命名規範:
actionClass-actionName-validation.xml
actionClass:action的類名
actionName:action的訪問名稱,及在struts.xml中配置的,<action name="">
validation.xml:固定後綴名。
比如:Demo02Action-Demo02Action_add-validation.xml 這種是對特定方法進行校驗
路徑:必須與action同包下
校驗文件的DTD:在xwork-core-x.x.x.jar中找到xwork-validator-x.x.x.dtd,打開它,內部會有一段DTD,我們把它copy過來,放到我們的校驗文件中
編寫校驗配置文件:
校驗規則有很多,在xwork-core-xxx.jar/com.opensymphony.xwork2/validator/validators/default.xml中就能夠找到所有的校驗規則。
如果想要查看某個校驗規則如何使用的話,看源碼,然後打開Javadoc進行查看,其中會有例子讓我們查看的。比如,我需要查看requiredstring的使用方法。
復制requiredstring的class
按shift+ctrl+t對該類進行查找。
查看文檔
文檔中會給出很詳細的註釋,看不懂例子中的參數,就往上看參數的解釋。這樣就會用了。
1.3、總結校驗器的使用
如果讓我自己選的話,肯定是選擇xml配置校驗的方法,因為,能使用struts2中的一些校驗規則,就無需自己編寫了,不過到後面應該都有其他更方便的校驗方法,而不會使用struts2內置的這些校驗。
二、攔截器
2.1、什麽是攔截器?
現在應該都知道了,前面說表單提交參數自動封裝時就提到了好幾種攔截器,而上面說校驗數據也提到了兩種攔截器,基本上我們也知道攔截器的作用是啥了,就是在到達action之前做的很多處理,提前幫我們做事情的一種機制,而我們並不需要編寫這些攔截器,因為struts2已經幫我們寫好了常用的一些攔截器,並且有個defaultStack的攔截器棧,我們使用的action就經過struts2提供的這個默認攔截器棧。其中有18個,也就是說,如果不修改默認攔截器棧,那麽每次我們訪問action,都會經過這18個攔截器棧,我們來看看哪18個,
2.2、struts2的默認攔截器棧(18個攔截器)
找到defaultStack。
其中我們應該了解很多個了,277行,i18n用來做國際化,281行,modeDriven用來數據封裝的,282行fileUpload,上傳下載的,285行staticParams用來獲取靜態參數的,287行params用做數據封裝的,290行conversionError標識數據類型轉換異常處理的,291行,validation用來做輸入校驗的 292行workflow用來檢測<filederror>是否有值,有值則跳到input結果碼對應的頁面。 其他的還沒講到到後面我都會一一講解清楚的,先大概了解一下。
2.3、自定義攔截器
大多數功能的攔截器struts2都已經幫我們寫好了,但是有一些,我們需要自己在往其中功能,那就必須自定義攔截器了。自定義攔截器很簡單,就分兩步即可。
第一步:編寫攔截器類,繼承AbstractInterceptor類。(它幫我們實現了Interceptor接口)
第二步:註冊攔截器
在struts.xml中註冊
在<package>聲明攔截器
在<action>中引用攔截器
但是一般不用這種,因為Struts2有這麽一種機制,一旦為Action指定了攔截器,那麽就不會再為這個Action執行默認攔截器了,即defaultStack這個攔截器棧中的攔截器都不會執行,也就是說,這個Action沒有輸入校驗、沒有參數註入、沒有國際化、沒有…,這是不行的,所以我們需要在這個<action>元素中再引用defaultStack攔截器棧。
這種雖然達到了我們的效果,但是非常麻煩,因為只有一個action,如果有十幾個action呢?需要為每個action配置默認攔截器棧和自定義攔截器,所以使用最後一種方案。
終極方案。創建一個攔截器棧,將默認攔截器棧和自定義攔截器加入其中,然後將struts2的默認攔截器棧修改為我們新構建的攔截器棧。
三、總結
了解了struts2中數據校驗的功能和struts2中的18個攔截器,還有如何自定義攔截器這些操作,個人感覺還是沒有難度的,現在只是在學習知識,學會這個知識點,等後面使用struts2來寫一個小的demo,就會將所有零碎的知識點整合到一起。好好努力。
struts2(三) 輸入校驗和攔截器