在struts+ hibernate 這種結構中是不應該把Hibernate產生的PO直接傳遞給JSP的不管他是Iterator還是List這是一個設計錯誤
我來談談在JEE架構中各層的數據表示方法
Web層的數據表示是FormBean數據來源於HTML Form POST
業務層的數據表示是VO
持久層的數據表示是PO其數據來源於數據庫持久層的數據表示例如CMP
在一個規范的JEE架構中不同層的數據表示應該被限制在層內而不應該擴散到其它層這樣可以降低層間的耦合性提高JEE架構整體的可維護性和可擴展性比如說Web層的邏輯進行了修改那麼只需要修改FormBean的結構而不需要觸動業務層和持久層的代碼修改同樣滴當數據庫表進行了小的調整那麼也只需要修改持久層數據表示而不需要觸動業務層代碼和Web層代碼
不過由於Hibernate的強大功能例如動態生成POPO的狀態管理可以脫離Session使得在應用了Hibernate的JEE框架中PO完全可以充當VO因此我們下面把PO和VO合並統稱為PO
先來談談ActionFormBean和持久層的PO之間的重大區別
在簡單的應用中ActionFormBean和PO幾乎是沒有區別所以很多人干脆就是用ActionFormBean來充當PO於是ActionFormBean從JSP頁面到Servlet控制層再到業務層然後穿過持久層最後一直映射到數據庫表真是一竿子捅到了底!
但是在復雜的應用中ActionFormBean和PO是分離的他們也不可能一樣ActionFormBean是和網頁裡面的Form表單一一對應的Form裡面有什麼元素Bean裡面就有什麼屬性而PO和數據庫表對應因此如果數據庫表不修改那麼PO也不會修改如果頁面的流程和數據庫表字段對應關系不一致那麼你又如何能夠使用ActionFormBean來取代PO呢?
比如說吧用戶注冊頁面要求注冊用戶的基本信息因此HTML Form裡面包含了基本信息屬性於是你需要一個ActionFormBean來一一對應(注意是一一對應)每個Bean屬性對應一個文本框或者選擇框什麼的
而用戶這個持久對象呢?他的屬性和ActionFormBean有什麼明顯不同呢?他會有一些ActionFormBean所沒有的集合屬性比如說用戶的權限屬性用戶的組屬性用戶的帖子等等另外還有可能的是在ActionFormBean裡面有個屬性分別是用戶的First Name Middle Name Last Name而在我的User這個持久對象中就是一個 Name 對象屬性
假設我的注冊頁面原來只要你提供First Name那麼ActionFormBean就這一個屬性後來我要你提供全名你要改ActionFormBean加兩個屬性但是這個時候PO是不應該修改滴因為數據庫沒有改
那麼在一個完整的JEE系統中應該如何進行合理的設計呢?
JSP(View) > ActionFormBean(Module) > Action(Control)
ActionFormBean是Web層的數據表示它和HTML頁面Form對應只要Web頁面的操作流程發生改變它就要相應的進行修改它不應該也不能被傳遞到業務層和持久層否則一旦頁面修改會一直牽連到業務層和持久層的大面積的代碼進行修改對於軟件的可維護性和可擴展性而言是一個災難Actiont就是他的邊界到此為止!
Action(Web Control) > Business Bean > DAO > ORM >DB
而PO則是業務層和持久層的數據表示它在業務層和持久層之間進行流動他不應該也不能被傳遞到Web層的View中去而ActionServlet就是他的邊界到此為止!
然後來看一看整個架構的流程
當用戶通過浏覽器訪問網頁提交了一個頁面於是Action拿到了這個FormBean他會把FormBean屬性讀出來然後構造一個PO對象再調用業務層的Bean類完成了注冊操作重定向到成功頁面而業務層Bean收到這個PO對象之後調用DAO接口方法進行持久對象的持久化操作
當用戶查詢某個會員的信息的時候他用全名進行查詢於是Action得到一個UserNameFormBean包括了個屬性分別是first name middle name last name然後Action把UserNameFormBean的個屬性讀出來構造Name對象再調用業務Bean把Name對象傳遞給業務Bean進行查詢
業務Bean取得Name(注意: Name對象只是User的一個屬性)對象之後調用DAO接口返回一個User的PO對象注意這個User不同於在Web層使用的UserFormBean他有很多集合屬性滴然後業務Bean把User對象返回給Action
Action拿到User之後把User的基本屬性取出(集合屬性如果不需要就免了)構造UserFormBean然後把UserFormBean requestsetAttribute()然後重定向到查詢結果頁面
查詢頁面拿到request對象裡面的ActionFormBean自動調用tag顯示之
總結
FormBean是Web層的數據表示他不能被傳遞到業務層;PO是持久層的數據表示在特定情況下例如Hibernate中他可以取代VO出現在業務層但是不管PO還是VO都必須限制在業務層內使用最多到達Web層的Control絕不能被擴散到View去
FormBean和PO之間的數據轉化是在Action中進行滴
BTW:
JDOx還不能像Hibernate功能這樣強大PO不能脫離持久層所以必須在業務層使用VO因此必須在業務層進行大量的VO和PO的轉化操作相對於Hibernate來說編程比較煩瑣
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28953.html