建構企業級 Web 應用面臨諸多挑戰:使用者介面、業務邏輯、資料持久化三大層次如何分工?如何實現層與層之間的鬆耦合?如何整合事務管理等容器級服務?本文展示如何整合 Struts(表現層)、Spring(業務層)、Hibernate(持久層)三大開源框架,構建清晰、可維護、可擴展的標準化架構。
| 層次 | 職責 | 避免事項 |
|---|---|---|
| 表現層 | 請求/回應處理、控制器委派、異常處理、顯示模型、UI 驗證 | JDBC 直連、業務邏輯、事務管理 |
| 業務層 | 業務邏輯/驗證、事務管理、層間介面、依賴管理、協調表現/持久層 | 直接資料庫操作、UI 邏輯 |
| 持久層 | 物件查詢/儲存/更新/刪除、ORM 映射、資料庫交互 | 業務邏輯、表現層邏輯 |
| 領域模型層 | 業務實體物件(訂單、商品等),跨層流轉,免 DTO 轉換 | — |
Spring 透過「依賴注入」(IoC)將各層組件鬆耦合連接:
// Order.java - 一對多關聯 OrderLineItem
public class Order {
private int id;
private String username;
private double total;
private Set lineItems = new HashSet<>();
// getter/setter...
}
// OrderLineItem.java
public class OrderLineItem {
private int id;
private String productName;
private int quantity;
private double price;
// getter/setter...
}
// IOrderDAO.java - 介面定義
public interface IOrderDAO {
Order findOrderById(int id);
List findOrdersPlaceByUser(String placedBy);
Order saveOrder(Order order);
}
// OrderHibernateDAO.java - 繼承 HibernateDaoSupport
public class OrderHibernateDAO extends HibernateDaoSupport implements IOrderDAO {
public Order saveOrder(Order order) {
getHibernateTemplate().saveOrUpdate(order);
return order;
}
// 其他方法實作...
}
// IOrderService.java
public interface IOrderService {
Order saveNewOrder(Order order) throws OrderException, OrderMinimumAmountException;
List findOrderByUser(String user) throws OrderException;
Order findOrderById(int id) throws OrderException;
void setOrderDAO(IOrderDAO orderDAO); // Setter 注入點
}
// OrderServiceSpringImpl.java
public class OrderServiceSpringImpl implements IOrderService {
private IOrderDAO orderDAO;
public Order saveNewOrder(Order order) throws OrderException, OrderMinimumAmountException {
// 業務驗證:最低訂單金額
if (order.getTotal() < MIN_AMOUNT)
throw new OrderMinimumAmountException();
return orderDAO.saveOrder(order);
}
// 其他方法委派 DAO...
public void setOrderDAO(IOrderDAO orderDAO) { this.orderDAO = orderDAO; }
}
com/meagle/bo/Order.hbm.xml
com/meagle/bo/OrderLineItem.hbm.xml
net.sf.hibernate.dialect.MySQLDialect
false
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
// BaseAction.java - Service Locator 模式取得 Spring Bean
public abstract class BaseAction extends Action {
private IOrderService orderService;
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
WebApplicationContext wac = WebApplicationContextUtils
.getRequiredWebApplicationContext(actionServlet.getServletContext());
this.orderService = (IOrderService) wac.getBean("orderService");
}
protected IOrderService getOrderService() { return orderService; }
}
// SaveOrderAction.java - 委派業務層處理
public class SaveOrderAction extends BaseAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
OrderForm oForm = (OrderForm) form;
Order order = buildOrderFromForm(oForm); // 從表單建構領域物件
getOrderService().saveNewOrder(order); // 委派業務層
oForm.setOrder(order);
saveMessages(request, new ActionMessage("message.order.saved.successfully"));
return mapping.findForward("success");
}
}
Struts + Spring + Hibernate 的經典整合展現了「分而治之」的架構智慧。透過 Spring IoC 容器串聯三層,配合介面導向設計與聲明式事務,構建出高內聚、低耦合、易擴展的企業級應用基石。此架構模式雖歷經歲月,其核心思想仍為現代微服務與雲原生架構的重要啟發來源。