一個關於Struts Action的小框架, 請高手指點一下
首先是一個基類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; 就必須寫在所有的子方法中。
不知道我這樣做能不能較好的解決上面的問題?雖然會帶來一些初始化的負擔,但是實際執行時應該不會怎麼影響效率。我主要關心的是,這個結構還可不可以最佳化?另外有沒有什麼安全/效率方面的硬傷?望高手們多多指點!
=================================================================
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; 就必須寫在所有的子方法中。
不知道我這樣做能不能較好的解決上面的問題?雖然會帶來一些初始化的負擔,但是實際執行時應該不會怎麼影響效率。我主要關心的是,這個結構還可不可以最佳化?另外有沒有什麼安全/效率方面的硬傷?望高手們多多指點!
相關文章
- JAVAEE框架學習——Struts2——Action API 使用Java框架API
- Struts2中Action動態呼叫DMI出現的一個問題
- 關於php的try catch 使用的疑惑,希望高手指點PHP
- Github Action 快速上手指南Github
- 【譯】一份關於npm的新手指南NPM
- 關於v-for的一點小總結
- 關於 /dev/null 差點直播吃鞋的一個小問題devNull
- 關於SSM框架的一個簡單DemoSSM框架
- 關於range的一個知識點
- Python中關於Thread的一點小知識Pythonthread
- Golang - 關於 proto 檔案的一點小思考Golang
- 關於 Laravel 框架事件系統的一點認識Laravel框架事件
- 關於 JavaScript 字串的一個小知識JavaScript字串
- 一個關於JAVA GC的小實驗JavaGC
- Struts框架_9 Struts2的驗證框架
- 分享一下一個小發現--Laravel 框架的整套測試用例Laravel框架
- 關於使用iview中Table元件的一點小技巧View元件
- 關於spring迴圈依賴的一點小感悟Spring
- Struts2 action前的資料預處理
- 關於C++ scanf的一個小知識C++
- 發現了一個關於 gin 1.3.0 框架的 bug框架
- 有沒有和laravel一樣的golang框架!請推薦一下!LaravelGolang框架
- 【Java面試】請說一下Mysql索引的優點和缺點?Java面試MySql索引
- 關於輸出的小語法點
- (三)struts2進階之實現Action
- 關於高防伺服器的一些知識點伺服器
- 關於使用plsql操作oracle的一點小技巧和幾個常用的查詢語句SQLOracle
- 請用canvas寫一個關於520浪漫表白的程式碼Canvas
- 8個關於Python的小技巧Python
- 關於使用plsql操作oracle的一點小技巧和幾個常用的查詢語句BUSQLOracle
- 一個基於 gin+ grpc + etcd 等框架開發的小栗子RPC框架
- Struts2教程之二Action建立方式
- Struts2教程之三Action訪問方式
- 揭祕!一個高準確率的Flutter埋點框架如何設計Flutter框架
- 請教各位一個關於websocket協議開發的問題Web協議
- 關於 curl 工作中一個小錯誤
- 關於《明日方舟》單局優點的一個思考
- 關於CSW和Bitcoin SV,我們不妨看一下局外人的觀點
- 總結一下基於 Lumen 框架的專案架構框架架構