構建非簡單 Web 應用時,開發者面臨三大核心挑戰:
優秀框架應具備:解決特定領域複雜度、可擴展、社群支援。單一框架難以覆蓋所有層次,整合多框架讓各層專注核心職責,透過介面鬆耦合溝通,實現層級替換不影響整體。
職責:
嚴禁: 直接 JDBC、業務邏輯、事務管理、資料庫操作。
職責:
嚴禁: 業務邏輯、與表現層直接耦合。
核心:依賴注入(DI)/ 控制反轉(IoC)
透過 XML 設定檔(或註解)將 DataSource、TransactionManager、DAO、Service 串聯。
POJO 實體類別(如 Order、OrderLineItem),在各層間流動。Hibernate 直接持久化領域物件,避免 DTO 轉換損失與額外程式碼。
// com.meagle.bo.Order.java
public class Order {
private Long id;
private Date orderDate;
private Set<OrderLineItem> lineItems = new HashSet<>();
// getters/setters
}
// com.meagle.bo.OrderLineItem.java
public class OrderLineItem {
private Long id;
private Product product;
private int quantity;
private BigDecimal price;
// getters/setters
}
<!-- Order.hbm.xml -->
<class name="com.meagle.bo.Order" table="ORDERS">
<id name="id" column="ORDER_ID">
<generator class="native"/>
</id>
<set name="lineItems" cascade="all">
<key column="ORDER_ID"/>
<one-to-many class="com.meagle.bo.OrderLineItem"/>
</set>
</class>
DAO 介面與實作:
public interface OrderDAO {
Order findById(Long id);
void save(Order order);
}
public class OrderDAOHibernate implements OrderDAO {
private HibernateTemplate hibernateTemplate;
// 注入 HibernateTemplate
public Order findById(Long id) {
return (Order) hibernateTemplate.get(Order.class, id);
}
// ...
}
public interface OrderService {
Order createOrder(Order order);
Order getOrder(Long id);
}
public class OrderServiceImpl implements OrderService {
private OrderDAO orderDAO;
// setter 注入
public Order createOrder(Order order) {
// 業務邏輯、驗證
orderDAO.save(order);
return order;
}
}
<!-- applicationContext.xml -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" ... />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list><value>Order.hbm.xml</value></list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="orderDAO" class="com.meagle.service.dao.hibernate.OrderDAOHibernate">
<property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="orderService" class="com.meagle.service.OrderServiceImpl">
<property name="orderDAO" ref="orderDAO"/>
</bean>
在 struts-config.xml 設定 DelegatingActionProxy,Action 由 Spring 容器管理:
<action path="/order" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="success" path="/orderSuccess.jsp"/>
</action>
Action 類別:
public class OrderAction extends Action {
private OrderService orderService;
public void setOrderService(OrderService orderService) { this.orderService = orderService; }
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {
OrderForm of = (OrderForm) form;
Order order = of.getOrder();
orderService.createOrder(order);
return mapping.findForward("success");
}
}
Spring 設定 Action:
<bean name="/order" class="com.meagle.action.OrderAction" singleton="false">
<property name="orderService" ref="orderService"/>
</bean>
| 層級 | 框架 | 核心價值 | 替換彈性 |
|---|---|---|---|
| 表現 | Struts | 請求分派、驗證、標籤庫 | 可換 Spring MVC、JSF、WebWork |
| 業務 | Spring | DI、AOP、宣告式事務、服務抽象 | 可換 PicoContainer、EJB 3.0 |
| 持久 | Hibernate | ORM、HQL、快取、透明持久化 | 可換 iBATIS、JPA、JDO |
bo(領域)、service(業務)、dao(持久)、action/form(表現)