首先是一個基類BaseAction ================================================================= public class BaseAction extends ActionSupport { /** 簡單的得到spring bean的方法*/ public Object getBean(String beanName) { return this.getWebApplicationContext().getBean(beanName); }
/** 由子類Action對象調(diào)用, 可以在初始化時反射自身的結(jié)構(gòu), 形成一個映射, 用來日后dispatchSubaction. * * @return 存放了methods對象的Map */ protected Map getMethodMap() { ...... }
/** 將Action轉(zhuǎn)移給子動作. * 在子類中調(diào)用時,,只需要新建一個Object[] {參數(shù)1, 參數(shù)2, ...} 一般為 {form, request, dao} * 然后調(diào)用dispatchSubAction(String, objects) 即可 * * @param action 字符串,,決定子動作的方法名 * @param objs 參數(shù)對象列表 * @param methods 由getMethodMap得到的Map * @return 用來findForward的別名 */ protected String dispatchSubAction(String action, Object[] objs, Map methods) throws Exception { ...... }
之后是子類的寫法: ================================================================ public class SomeAction extends BaseAction { protected Map methods = getMethodMap(); //各線程公用 //--------- 下面是此Action中公用的一些對象,線程安全,? XxxDAO xxxDao=(XxxDAO) getBean("xxxDao"); XxxService xxxService = (XxxService) getBean("xxxService");
public ActionForward execute(......) throws Exception { // ===================== 初始化環(huán)境 ===================== \\ XxxForm form = (XxxForm) actionForm; ActionErrors errors = new ActionErrors();
// ==================== 獲取用戶參數(shù) ==================== \\ //主要是進行數(shù)據(jù)轉(zhuǎn)換如:form.setXxx() = form.getXxx().split("..");
// ==================== 調(diào)用業(yè)務(wù)邏輯 ==================== \\ Object[] params = {form, request, errors}; //這里的params要和下面定義的所有子程序的參數(shù)對應(yīng)起來 String forward = dispatchSubAction(form.getSubaction(), params, methods);
// ==================== 設(shè)置回傳參數(shù) ==================== \\ saveErrors(request,errors); return mapping.findForward(forward); }
//所有的子程序的參數(shù)聲明都應(yīng)該相同, 但是每個Action可以根據(jù)自己的情況有所區(qū)別 public String show(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) { ...... return "show"; }
public String edit(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) { ...... return "edit"; }
public String save(MonthDayExecuteForm form, HttpServletRequest request, ActionErrors errors) { ...... return "show"; } } ================================================================ 歸納:我知道struts有l(wèi)ookupDispatchAction,,1.2還有MappedAction,,但是那些東西使用起來都不太方便,。 1. 有的需要在MessageResources里面進行Submit按鈕文字定義。 2. 有的需要在config中有特殊的配置 3. 必須使用和execute完全相同的冗長的函數(shù)聲明 4. 各方法之間沒有交集,,難以實現(xiàn)統(tǒng)一的log處理,,代碼重復(fù)寫的太多,例如一個簡單的XxxForm form = (XxxForm) actionForm; 就必須寫在所有的子方法中,。
不知道我這樣做能不能較好的解決上面的問題,?雖然會帶來一些初始化的負(fù)擔(dān),但是實際運行時應(yīng)該不會怎么影響效率,。我主要關(guān)心的是,,這個結(jié)構(gòu)還可不可以優(yōu)化?另外有沒有什么安全/效率方面的硬傷,?望高手們多多指點,! |