首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

超輕量 MVC 框架 AJF 1.2 發布:融合 Struts、WebWork、Spring MVC 精華的敏捷 Java 框架實戰解析

     編輯:Java 相關知識

框架定位與設計哲學

AJF(Agile Java Framework)是一個極簡 MVC 框架,設計靈感融合 Struts、WebWork、Spring MVC 精華,核心目標是「約定優於配置、零配置可用、單一 Action 多操作、輕量級 AOP 能力」。框架整合 Command、Template、Proxy、Decorator、Filter、Chain 等設計模式,實現類 AOP 功能,輕鬆解決日誌、權限、連線、事務等橫切關注點。

核心架構特性

1. 超強魔力 Action 基類體系

BaseAction extends Action
XXXAction extends BaseAction
// 一個 Action 多個操作,透過 method 參數反射調用 execute_{method}
  • 執行緒安全:每請求新建 Action 實例(同 WebWork),成員變數無競態風險
  • 生命週期攔截:preHandler()、postHandler()、exceptionHandler() 三大擴充點,源自 Spring MVC 設計
  • 自動事務管理:呼叫 start() 開啟事務容器,後續資料庫操作自動提交/回滾/關閉連線(非分散式事務,滿足一般專案需求)
  • 零配置模式:JSP 中直接實例化 Action 呼叫 run(request, response, "method")

2. 靈活的導向機制

  • ! 前綴:redirect(如 return "!query")
  • 無前綴:forward(如 return "edit")

3. 配置檔 ajf.xml 極簡映射

/pages/commons/error.jsp
/pages/commons/ajf_home.jsp
/pages/commons/no_object.jsp

user.do
user_query.jsp
user_input.jsp
user_edit.jsp
user_view.jsp

實戰代碼深度解析:用戶 CRUD 單 Action 實現

BaseAction.java —— 基礎設施層

public class BaseAction extends Action {
    String action = null;
    String actionClassName = null;
    long start = 0, end = 0, diff = 0;
    Map ajf_system_request_map = null;

    public String preHandler() throws Exception {
        ajf_system_request_map = JSPUtil.getRequestModel(request);
        start = StringUtil.getNowMs();
        return null;  // 非 null 將中斷執行流程
    }

    public String postHandler() throws Exception {
        end = StringUtil.getNowMs();
        diff = end - start;
        LogUtil.info(diff + "," + JSPUtil.getUrl(request) + "," + ajf_system_request_map);
        return null;
    }

    public void exceptionHandler(Exception e) throws Exception {
        LogUtil.error(actionClassName + ",exception handler," + e + "," + StringUtil.getNowTime());
    }
}

設計亮點:請求模型提取、效能計時、結構化日誌記錄、異常統一捕獲,零業務邏輯耦合。

UserAction.java —— 業務邏輯層

public class UserAction extends BaseAction {

    public String execute() throws Exception { return execute_query(); }

    public String execute_query() throws Exception {
        createTable();  // 示範用,實際應由遷移腳本管理
        String sql = "select * from t_user";
        conn = DBUtil.getConn();
        Map map = PagedUtil.queryString(conn, sql, 1, 1, request);  // 分頁查詢
        add(map);  // 將資料放入 Action 內部 Map,供 JSP 取用
        return "q";  // forward 到 user_query.jsp
    }

    public String execute_input() throws Exception { return "input"; }

    public String execute_insert() throws Exception {
        String table = "t_user";
        String cols = "id,name,hh,ww,birth_day";
        int autoPK = 1;
        conn = DBUtil.getConn();
        DBUtil.insert(conn, table, cols, autoPK, model);  // model 為請求參數綁定 Map
        return "!query";  // redirect 到 query 操作
    }

    public String execute_edit() throws Exception {
        String objectid = (String) model.get("objectid");
        String sql = "select * from t_user where id='" + objectid + "'";
        conn = DBUtil.getConn();
        Map user = DBUtil.queryOne(conn, sql, null);
        if (user == null) return "no_object";
        model.put("user", user);
        return "edit";
    }

    public String execute_view() throws Exception { /* 同 edit 邏輯 */ }

    public String execute_update() throws Exception {
        String table = "t_user";
        String cols = "id,name,hh,ww,birth_day";
        int autoPK = 1;
        conn = DBUtil.getConn();
        DBUtil.updateRow(conn, table, cols, 1, model);
        return "!query";
    }

    public String execute_delete() throws Exception {
        String sql = "delete from t_user where id ";
        DBUtil.batchDelById(sql, request);  // 批次刪除支援
        return "!query";
    }

    private void createTable() { /* 建表示例 SQL */ }
}

關鍵設計模式應用分析

模式AJF 應用場景效益
Template MethodAction 執行流程:preHandler → execute_xxx → postHandler固定骨架,子類擴充業務邏輯
ProxyDBUtil 封裝 JDBC,事務管理透明化業務碼無感知連線/事務細節
Chain of Responsibility攔截器鏈處理請求預處理、後處理、異常橫切關注點模組化、可組合
Command每個 execute_xxx 方法封裝單一業務操作參數化請求、支援撤銷/重做擴充
DecoratorAction 基類裝飾日誌、計時、事務功能動態組合行為、不修改核心邏輯

框架定位與適用場景

  • 中小型專案:快速開發、團隊輕量級、無需完整 Spring 生態
  • 維護舊系統:JSP 為主、逐步引入 MVC 分層、不想引入重框架
  • 教學與原型驗證:核心代碼極少(< 2000 行),適合研讀 MVC 與 AOP 核心機制
  • 嵌入式/受限環境:Jar 體積極小、零第三方依賴(除 Servlet API)

局限性與演進建議

  1. 無分散式事務支援:僅適用單資料源本地事務
  2. 缺乏表單驗證框架:需自行整合 Commons Validator 或手工驗證
  3. 無內建資料綁定/類型轉換:request 參數手工映射到 model Map
  4. 視圖技術綁定 JSP:難以支援 FreeMarker、Velocity、Thymeleaf 等現代模板引擎
  5. 建議演進方向:引入註解式路由、整合 Jackson 支援 REST/JSON、提供 Spring Boot Starter 封裝

總結

AJF 1.2 用不到 500 行核心代碼,展示了 MVC、AOP、事務管理、攔截器鏈的精髓實現。它不是企業級框架的替代品,而是一個「教科書級」的極簡參考實作——讓開發者看清大型框架底層運作本質,也為資源受限、快速交付場景提供可落地的輕量選擇。若你正在造輪子、讀源碼、或維護十年前的 JSP 專案,AJF 值得收藏研讀。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved