在 Struts + Hibernate 架構中,**切勿將 Hibernate 產生的 PO (持久化物件) 直接傳遞給 JSP**,無論是 Iterator、List 或單一物件,這都是設計錯誤。J2EE 分層架構要求各層資料表示物件應限制在層內,不應跨層流動,以降低耦合、提升可維護性與擴展性。
| 層級 | 資料表示 | 資料來源 | 邊界 |
|---|---|---|---|
| Web 層 (View/Control) | ActionFormBean (Form Bean) | HTML Form POST | Action Servlet |
| 業務層 | Value Object (VO) / PO | 業務邏輯組裝 | Action / Service |
| 持久層 | Persistent Object (PO) | 資料庫 | DAO / ORM |
Hibernate 的強大功能 (動態生成 PO、脫離 Session 的狀態管理) 使 PO 可充當 VO,故下文將 PO 與 VO 合稱 PO。
許多開發者直接用 ActionFormBean 當 PO,形成「一竿子捅到底」的反模式:JSP → Servlet → Service → DAO → DB,任何頁面異動都波及全系統。
Name 物件屬性,另含 permissions、groups、posts 等集合屬性JSP (View)
→ ActionFormBean (Web Module)
→ Action (Control)
├─ 讀取 FormBean 屬性
├─ 組裝 PO 物件
├─ 呼叫 Business Bean (業務層)
│ └─ 呼叫 DAO → ORM → DB
└─ 取回 PO → 組裝 FormBean → request.setAttribute → 轉向結果頁
JSP 透過 Tag 顯示 FormBean
UserNameFormBean (first/middle/lastName)Name 物件 → 呼叫 Business BeanUser PO (含集合屬性)UserFormBean → 放入 request → 轉向頁面