一個關於Struts Action的小框架, 請高手指點一下

warbaby發表於2005-03-30
首先是一個基類BaseAction
=================================================================
public class BaseAction extends ActionSupport {
/** 簡單的得到spring bean的方法*/
public Object getBean(String beanName) {
return this.getWebApplicationContext().getBean(beanName);
}

/** 由子類Action物件呼叫, 可以在初始化時反射自身的結構, 形成一個對映, 用來日後dispatchSubaction.
*
* @return 存放了methods物件的Map
*/
protected Map getMethodMap() {
......
}

/** 將Action轉移給子動作.
* 在子類中呼叫時,只需要新建一個Object[] {引數1, 引數2, ...} 一般為 {form, request, dao}
* 然後呼叫dispatchSubAction(String, objects) 即可
*
* @param action 字串,決定子動作的方法名
* @param objs 引數物件列表
* @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 {
// ===================== 初始化環境 ===================== \\
XxxForm form = (XxxForm) actionForm;
ActionErrors errors = new ActionErrors();

// ==================== 獲取使用者引數 ==================== \\
//主要是進行資料轉換如:form.setXxx() = form.getXxx().split("..");

// ==================== 呼叫業務邏輯 ==================== \\
Object[] params = {form, request, errors};
//這裡的params要和下面定義的所有子程式的引數對應起來
String forward = dispatchSubAction(form.getSubaction(), params, methods);

// ==================== 設定回傳引數 ==================== \\
saveErrors(request,errors);
return mapping.findForward(forward);
}

//所有的子程式的引數宣告都應該相同, 但是每個Action可以根據自己的情況有所區別
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有lookupDispatchAction,1.2還有MappedAction,但是那些東西使用起來都不太方便。
1. 有的需要在MessageResources裡面進行Submit按鈕文字定義。
2. 有的需要在config中有特殊的配置
3. 必須使用和execute完全相同的冗長的函式宣告
4. 各方法之間沒有交集,難以實現統一的log處理,程式碼重複寫的太多,例如一個簡單的XxxForm form = (XxxForm) actionForm; 就必須寫在所有的子方法中。

不知道我這樣做能不能較好的解決上面的問題?雖然會帶來一些初始化的負擔,但是實際執行時應該不會怎麼影響效率。我主要關心的是,這個結構還可不可以最佳化?另外有沒有什麼安全/效率方面的硬傷?望高手們多多指點!

相關文章