public String addUser() {
if (user == null) return FAIL_NO_USER;
Result result = null;
if (Role.ADMIN.equals(user.getRole())) {
result = doSomethingForAdmin(user);
} else {
result = doSomethingForOthers(user);
}
Transaction trans = sess.beginTransaction();
Query query = sess.createQuery("update Result set level = :level");
query.setParameter("level", result.getLevel());
query.executeUpdate();
trans.commit();
sess.close();
return SUCCESS;
}
頁面邏輯、業務規則、數據訪問、事務控制糅雜一塊,測試困難、復用為零、維護噩夢。
| 層 | 核心職責 | 禁止事項 |
|---|---|---|
| Action(控制層) | 處理 HTTP 請求/響應、參數校驗、視圖導航、Session 管理 | 不操作業務對象、不含業務規則、不直接訪問數據庫 |
| Service(業務層) | 封裝業務規則、跨多個業務對象協調、事務邊界控制 | 不依賴 Web 技術、不操作 HttpServletRequest/Response、不寫 SQL |
| DAO(數據訪問層) | 單一業務對象的 CRUD、複雜查詢、持久化細節封裝 | 不包含業務規則、不跨業務對象操作 |
// Action
public String addUser() {
if (user == null) return FAIL_NO_USER;
Result result = userService.process(user); // 業務委託
resultDao.update(result); // 持久化委託
return SUCCESS;
}
// Service
public Result process(User user) {
if (Role.ADMIN.equals(user.getRole())) return doSomethingForAdmin(user);
return doSomethingForOthers(user);
}
// DAO
public void update(Result result) {
Transaction trans = sess.beginTransaction();
Query query = sess.createQuery("update Result set level = :level");
query.setParameter("level", result.getLevel());
query.executeUpdate();
trans.commit();
sess.close();
}
分層邊界非一成不変:
持續重構,保持「高內聚、低耦合、職責單一」是核心。