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

MVC 架構下控制器與模型間資料傳遞:ParamBean 設計模式

     編輯:Java 相關知識

設計動機

MVC 框架中,控制器 (Controller) 與模型 (Model) 需交換大量參數與查詢結果。採用單一 ParamBean 封裝傳輸,避免參數列過長、型別不一、擴充困難等問題。

ParamBean 核心實作

public class ParamBean implements Serializable {
    // 日誌相關欄位
    private String opr_code = "", dep_code = "", menu_code = "", op_desc = "";
    // 執行結果
    private int ret_code = 0;           // 0 成功
    private String err_msg = "";
    // 參數容器
    private Hashtable ht = new Hashtable();
    // 查詢結果集
    private CachedRowSet crs = null;

    public ParamBean() { /* 初始化 */ }

    // 設定日誌資訊
    public void set_info(String opr, String dep, String menu, String desc) { ... }

    // 參數操作:新增/取得/移除/計數/清空
    public void add_param(String name, Object value) {
        if (name == null || value == null) return;
        name = name.trim();
        if ("".equalsIgnoreCase(name)) return;
        ht.put(name, value);
    }
    public Object get_param(String name) {
        if (name != null) {
            name = name.trim();
            if (!"".equalsIgnoreCase(name)) return ht.get(name);
        }
        return null;
    }
    public void remove_param(String name) { ... }
    public int get_param_count() { return ht.size(); }
    public void clear_param() { ht.clear(); }

    // CachedRowSet 封裝:將 ResultSet 脫機快照,避免連線佔用
    public boolean set_crs(ResultSet rs) {
        try {
            crs = new CachedRowSetImpl();
            crs.populate(rs);
            return true;
        } catch (Exception e) { e.printStackTrace(); return false; }
    }

    // 狀態控制
    public void setErr_msg(String msg) { this.ret_code = -1; this.err_msg = msg; }
    public void setSuccess() { this.ret_code = 0; this.err_msg = ""; }
    public boolean success() { return ret_code == 0; }
    // 各欄位 getter/setter 略
}

控制器層使用範例

ParamBean param = new ParamBean();
String depCode = (String) request.getSession().getAttribute("LOGIN_USER_DEP");
param.add_param("DEP_CODE", depCode);
// 呼叫模型層業務方法
param = model.loginAuth(param);

模型層業務邏輯範例

public ParamBean loginAuth(ParamBean param) throws Exception {
    String userCode = (String) param.get_param("USER_CODE");
    param.clear_param(); // 清除輸入參數,準備回傳結果

    String sql = "SELECT * FROM users WHERE user_code = ?";
    sqlExecQuery(param, sql, userCode); // 參數化查詢(略)
    return param;
}

private void sqlExecQuery(ParamBean param, String sql, Object... args) throws Exception {
    DatabaseBean db = getDatabase();
    param.setErr_msg(""); param.setRet_code(-1);
    try {
        param.set_crs(db.executeQuery(sql, args)); // 封裝 ResultSet
        param.setSuccess();
        db.close();
    } catch (Exception ex) {
        param.setErr_msg(ex.getMessage());
        ex.printStackTrace();
    }
}

控制器層後續處理

if (param.success()) {
    request.setAttribute("PARAM_CRS", param.getCrs()); // 轉發給 View
    // 進一步處理 CachedRowSet:分頁、轉 JSON 等
} else {
    System.out.println(param.getErr_msg());
    throw new Exception(param.getErr_msg());
}

關鍵設計點說明

  • Hashtable 參數容器:鍵值對靈活存取,支援任意型別,適合動態參數場景。
  • CachedRowSet 脫機結果集:CachedRowSetImpl.populate(ResultSet) 將查詢結果快照至記憶體,關閉資料庫連線後仍可操作,解決連線洩漏與傳遞序列化問題。
  • 統一狀態碼:ret_code=0 成功,-1 失敗,配合 err_msg 傳遞錯誤詳情,簡化控制器判斷邏輯。
  • Serializable:支援分散式部署下的 Session 複製或遠端呼叫。

擴充建議

  • 改用 ConcurrentHashMap 替代 Hashtable 提升並發效能。
  • 引入泛型 Map<String, Object> 增強型別安全。
  • 整合參數驗證框架(如 Hibernate Validator),在 add_param 時自動校驗。
  • 針對大量資料考慮分頁載入,避免 CachedRowSet 記憶體溢位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved