MVC 框架中,控制器 (Controller) 與模型 (Model) 需交換大量參數與查詢結果。採用單一 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());
}
CachedRowSetImpl.populate(ResultSet) 將查詢結果快照至記憶體,關閉資料庫連線後仍可操作,解決連線洩漏與傳遞序列化問題。ret_code=0 成功,-1 失敗,配合 err_msg 傳遞錯誤詳情,簡化控制器判斷邏輯。ConcurrentHashMap 替代 Hashtable 提升並發效能。Map<String, Object> 增強型別安全。add_param 時自動校驗。CachedRowSet 記憶體溢位。