原文地址:http://blog.csdn.net/ForWayfarer/archive/2008/09/20/2955812.aspx
1.struts2怎么實現方法簽名(類似于struts1的DispatchAction):在strust.xml中配置如下
<action ... method="register" ></action>
<action ... method="login" ></action>
<action ... method="insert" ></action>
(1)struts2怎么實現分發驗證:對應于每個方法簽名,可以有相應的validate()方法如下
public void validateRegister()
public void validateLogin()
public void validateInsert()
(2)struts2怎么實現分發驗證:對應于每個方法簽名,可以有相應的驗證框架如下
UserAction-register-validation.xml
UserAction-login-validation.xml
UserAction-insert-validation.xml
2.驗證順序
在struts1中,如果在FormBean中覆蓋了validate()方法,讓其放回null值,則驗證框架(xml驗證)就會失效。返回
null則代表驗證通過or無需驗證;覆蓋的validate()方法如果返回super.validate(mapping,request)即調用父
類的validate(mapping,request),驗證框架才會起作用。也就是說,如果想讓驗證框架有效,則不要覆蓋validate()方法,
如果除了驗證框架驗證,你還想在validate()方法中添加一些其他驗證,可以覆蓋validate()方法,但返回值須為
super.validate(mapping,request)。
在struts2中類似。struts2的執行順序為:
(1). 首先Struts2對客戶端傳來的數據進行類型轉換;
(2). 類型轉換完畢后再進行輸入校驗,順序:UserAction-validation.xml -->
UserAction-login-validation.xml --> public void validateLogin(){}
--> public void validate(){};
(3). 如果類型轉換和輸入校驗都沒有錯誤發生,那么進入login()方法/execuet()方法(調用商業邏輯).
注意:如果類型轉換不成功,也同樣要進行輸入校驗,所以錯誤信息打印會將二者的錯誤信息全部打印出來
3.struts2的錯誤信息
struts2有兩種錯誤級別:addFieldError和addActionError
addActionError(String anErrorMessage) -- Add an Action-level error
message to this
Action:看源代碼對于Action級別的錯誤信息,實際上是放置在ArrayList中的,action級別的error不會在表單中顯示。
addFieldError(String fieldName, String errorMessage) -- Add an
error message for a given
field:看源代碼真正存放field級別錯誤信息的對象是LinkedHashMap,該LinkedHashMap的key是String類型
的,value是ArrayList類型的(addFielderror(String,
ArrayList)),實際上是:LinkedHashMap<String, ArrayList<String>>
errors。field級別的error會在表單中顯示。
源代碼中還有這樣一個方法:public boolean hasErrors() { if (hasActionErrors() ||
hasFieldErrors()) ...} 則返回input頁面,表示不論是field級別的還是action級別的,只要錯誤容器不為空,就返回
到input頁面。
另外:struts2驗證框架(xml驗證)是將錯誤保存在fielderror中的,而不是actionerror。所以在jsp顯示錯誤時要注意。
4.struts2支持客戶端驗證,s標簽依然支持js事件,所以客戶端驗證推薦自己寫js,不過基本不用struts做客戶端驗證。此外,s標簽即使你不給其設置id屬性,s標簽也會自動生成一個id(通過查看頁面源代碼(獲得s標簽的html代碼)可獲得),如果你自定義了id,則會將s標簽自動生成的id覆蓋。