校驗檔案的搜尋規則

weixin_34115824發表於2017-11-09

Struts 2的一個Action中可能包含了多個處理邏輯,當一個Action類中包含多個類似於execute的方法時,每個方法都是一個處理邏輯。不同的處理邏輯可能需要不同的校驗規則,Struts 2允許為不同控制邏輯指定不同校驗規則的支援。

當需要讓一個Action可以處理多個請求時,應該在配置該Action時指定method屬性。通過這種方式,就可以將一個Action處理類配置成多個邏輯Action

在上面的Action類中增加一個login方法,該login方法不做任何處理,只是簡單地返回success字串。下面在struts.xml檔案中將該Action類配置成兩個邏輯Action。配置這兩個邏輯Action的配置片段如下。

程式清單:codes\04\4.2\overrideRule\WEB-INF\src\struts.xml

<!--配置一個名為*ProAction

     對應的處理邏輯為RegistAction{1}方法-->

<action name="*Pro" class="org.crazyit.app.action.RegistAction"

     

     

     

假設上面兩個Action的校驗規則不同,註冊時的校驗規則還是之前的校驗規則,但登入的校驗規則需要增加的使用者名稱和密碼相同(這只是假設,實際應用中可能需要密碼和重複密碼相同,但不會要求使用者名稱和密碼相同)。

如果按之前的方式來指定校驗規則檔案,這個校驗規則檔案肯定分不清楚到底要校驗哪個處理邏輯。為了能精確控制每個校驗邏輯,Struts 2允許通過為校驗規則檔名增加Action別名來指定具體需要校驗的處理邏輯。即採用如下的形式:

<ActionClassName>-<ActionAliasName>-validation.xml

其中ActionClassNameAction處理類的類名,而ActionAliasName就是在struts.xml中配置該Action時所指定的name屬性。例如,如果我們需要為loginPro邏輯Action單獨指定校驗規則,則校驗檔案的檔名為RegistAction-loginPro-validation.xml(該檔案也需要與RegistActionclass檔案放在同一路徑下),該檔案的內容如下。

程式清單:codes\04\4.2\overrideRule\WEB-INF\src\org\crazyit\app\action\RegistAction-loginPro-validation.xml

<?xml version="1.0" encoding="GBK"?>

<!-- 指定Struts 2配置檔案的DTD資訊 -->

<!DOCTYPE validators PUBLIC

     

     

<!-- 校驗規則檔案的根元素 -->

<validators>

     <!-- 校驗name屬性 -->

     

          <!-- 使用表示式校驗器校驗name屬性 -->

          

               <!-- 指定name屬性和pass屬性必須相等 -->

               

               

          

     

</validators>

上面的校驗規則檔案僅僅指定了Actionname屬性必須和pass屬性相同,那麼系統中原有的校驗規則對loginPro Action是否依然有效呢?

上面使用了表示式校驗器,關於各校驗器的具體用法,請參閱下一節的介紹。

本應用原來的表單頁稍作修改,讓該表單頁具有兩個按鈕,一個“登入”提交按鈕提交到loginPro,另一個“註冊”提交按鈕提交到registPro。如果使用者單擊“登入”提交按鈕,該表單將會提交到loginPro Action,那麼上面指定的RegistAction-loginPro-validation.xml校驗規則就會起作用了。如果校驗失敗,看到如圖4.17所示的校驗失敗頁面。

 

4.17  增加校驗規則

從圖4.17中可以看出,RegistAction-validation.xml檔案中的校驗規則,依然會對名為loginProAction起作用。實際上,名為loginProAction中包含的校驗規則是RegistAction-validation.xmlRegistAction- loginPro-validation.xml兩個檔案中規則的總和。

除此之外,還有一種情形——如果系統中包含了兩個ActionBaseActionRegistAction,其中RegistAction繼承了BaseAction,且兩個Action都指定了對應的配置檔案,則RegistAction對應Action的校驗規則實際上是RegistAction-validation.xmlBaseAction-validation.xml兩個檔案中規則的總和。

假設系統有兩個ActionBaseActionRegistAction,則系統搜尋規則檔案順序如下:

1BaseAction-validation.xml

2BaseAction-別名-validation.xml

3RegistAction-validation.xml

4RegistAction-別名-validation.xml

這種搜尋與其他搜尋不同的是,即使找到第一個校驗規則,系統還會繼續搜尋,不管有沒有這4份檔案,也不管是否找到配置檔案,系統總是按固定順序搜尋。

假如系統的struts.xml檔案中有如下配置片段:

<!-- RegistActionlogin方法配置成一個邏輯Action -->

<action name="loginPro" class="org.crazyit.app.action.RegistAction" method="login">

     

</action>

如果上面的RegistAction類還繼承了BaseAction類,那麼上面這個名為loginAction的校驗規則是BaseAction-validation.xmlBaseAction-loginPro-validation.xmlRegistAction-validation.xmlRegistAction-loginPro-validation.xml 4份規則檔案裡規則的總和。

注意:

Struts 2搜尋規則檔案是從上而下的,實際用的校驗規則是所有校驗規則的總和。如果兩個校驗檔案中指定的校驗規則衝突,則後面檔案中的校驗規則取勝。

 

 

本文轉自 fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/882740 ,如需轉載請自行聯絡原作者

相關文章