對于struts框架,我們都知道我們寫的*Action類是繼承struts的Action(org.apache.struts.action.Action)類,并重寫其定義的execute方法,進而來實現我們自己的業務邏輯。
但考慮到到一些需求,我們可以在struts的Action和我們自己寫的*Action類之間加一層Action類來實現過濾功能,我們將其定義為BaseAction,整個繼承關系:*Action--extends---->BaseAction---extends--->Action。
舉例如下:
在ListAction類和Struts框架的Action類之間加一層BaseAction類。
ListAction:
//extends BaseAction
public class ListAction extends BaseAction {
public ActionForward doExecute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Exception {
Connection conn = null;
conn = this.getDataSource(request).getConnection();
BookDAO bookDAO = DAOFactory.getBookDAO(conn);
List list = bookDAO.findAll();
request.setAttribute("books", list);
return mapping.findForward(Constants.FORWARD_LIST);
}
//實現BaseAction中的needLogin方法,判斷*Action是否需要登陸驗證
public boolean needLogin() {
return true;
}
}
BaseAction:
public abstract class BaseAction extends Action {
//override the method execute of Action
public final ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
if(needLogin()){
//取出LoginAction中放入session中的用戶名"aaa"
Object o = request.getSession().getAttribute("aaa");
if(o == null){
//登陸驗證失敗,返回login.jsp
return actionMapping.findForward("login");
}
}
//返回調用ListAction中的doExcute()方法,執行業務邏輯
return doExecute(actionMapping, actionForm, request, response);
}
//abstract method
public abstract ActionForward doExecute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception;
//abstract method
public abstract boolean needLogin();
}
在BaseAction中重寫struts中Action的excute()方法,在ListAction中定義doexcute()方法并extends BaseAction類,登陸系統是根據login.do進入LoginAction,調用重寫struts中的excute()方法,此時LoginAction沒有,就到父類BaseAction去調用excute()方法,執行其業務邏輯后,如過用戶是已經登陸過就返回doExcute()方法,回到ListAction調用doExcute()的業務邏輯,如果是非登陸用戶則直接轉向Login.jsp。這里將java中多態,抽象類以及回調的思想體現得淋漓盡致。