上一篇文章中,那種數據驗證的方法不正規。
一般來說,兩種驗證方式,一是客戶端的驗證,例如JavaScript;另外一種,服務端的驗證,Action中的validation方法。
客戶端的數據安全性就比較低,因爲客戶可以跳過驗證。validation的就相對嚴謹些。
同樣,我用UserManager類來管理驗證也行。
------------------UserManager.java
因爲有了一個實體類,User.java 所以,這兒用一個UserManager 來管理它,該類中採用了Singleton(單例模式),提供一個沒有返回值的Login方法,用以相關的業務判斷。
拋出的錯誤,有兩個:
一個是 UserNotFoundException,找不到用戶,
package com.wgy.struts;
public class UserNotFoundException extends RuntimeException {
}
一個是 PasswordErrorException 密碼錯誤
package com.wgy.struts;
public class PasswordErrorException extends RuntimeException {
}
------------------------------------------------------------------
LoginActionForm.java 在這個ActionForm 中添加了 reset 和 validation 的方法。打印出來,證明程序時可以執行到這兩個方法。
原因在於這兒,struts-config.xml 文件中,
- <action path="/login"
- type="com.wgy.struts.LoginAction"
- name="loginForm"
- scope="request"
- validation="true"
- >
validation="true" 這是默認值。 設置爲FALSE之後這兩個方法就不可以執行了。
ActionForm 的生命週期可以設置爲session(默認) 和 request,當設置爲session 時,要記得在reset方法中將所有的屬性重新設置爲初始值。
如:
public void reset(){
username = null;
password = null;
}
而validation 方法中就可以寫上判斷業務邏輯的code。
LoginActionForm.java
------------------------------------------------------------------------
如果在UserManager.java 或者 validation方法中設置了判斷邏輯,那在Action中就可以不用重複寫了。
因爲考慮到有異常,所以要捕獲。成功通過驗證,就通過 return mapping.findForward("success"); 定義到成功頁面
錯誤 則 return mapping.findForward("error");
login_error.jsp 頁面中要獲得錯誤信息: <%=request.getAttribute("errorInfo") %>
login_success.jsp中要獲得username
(LoginActionForm)request.getAttribute("loginForm");
- <action-mappings>
- <action path="/login"
- type="com.wgy.struts.LoginAction"
- name="loginForm"
- scope="request"
- >
中的name 相同。
==============================
小結一下:
牢記原則,不要再Action中進行業務邏輯處理,業務邏輯應該交給專門的model層去處理
在業務邏輯層拋出異常,在Action 中捕捉並且處理。