Struts Hibernate資料表示

2021-08-22 17:44:28 字數 2650 閱讀 3801

在 struts+ hibernate 這種結構中,是不應該把hibernate產生的po直接傳遞給jsp的,不管他是iterator,還是list,這是乙個設計錯誤。

我來談談在j2ee架構中各層的資料表示方法:

web層的資料表示是formbean,資料**於html form post

業務層的資料表示是vo

持久層的資料表示是po,其資料**於資料庫,持久層的資料表示例如cmp。在乙個規範的j2ee架構中,不同層的資料表示應該被限制在層內,而不應該擴散到其它層,這樣可以降低層間的耦合性,提高j2ee架構整體的可維護性和可擴充套件性。比如說web層的邏輯進行了修改,那麼只需要修改formbean的結構,而不需要觸動業務層和持久層的**修改。同樣滴,當資料庫表進行了小的調整,那麼也只需要修改持久層資料表示,而不需要觸動業務層**和web層**。

不過由於hibernate的強大功能,例如動態生成po,po的狀態管理可以脫離session,使得在應用了hibernate的j2ee框架中,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裡面有3個屬性,分別是使用者的first name, middle name, last name,而在我的user這個持久物件中就是乙個 name 物件屬性。

假設我的註冊頁面原來只要你提供first name,那麼actionformbean就這乙個屬性,後來我要你提供全名,你要改actionformbean,加兩個屬性。但是這個時候po是不應該修改滴,因為資料庫沒有改。

那麼在乙個完整的j2ee系統中應該如何進行合理的設計呢?

jsp(view) ---> action form bean (module) ---> action(control)

action form bean是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包括了3個屬性,分別是first name, middle name, last name,然後action把usernameformbean的3個屬性讀出來,構造name物件,再呼叫業務bean,把name物件傳遞給業務bean,進行查詢。

業務bean取得name(注意: name物件只是user的乙個屬性)物件之後呼叫dao介面,返回乙個user的po物件,注意這個user不同於在web層使用的userformbean,他有很多集合屬性滴。然後業務bean把user物件返回給action。

action拿到user之後,把user的基本屬性取出(集合屬性如果不需要就免了),構造userformbean,然後把userformbean request.setattribute(...),然後重定向到查詢結果頁面。

查詢頁面拿到request物件裡面的actionformbean,自動呼叫tag顯示之。

總結:

form bean 是web層的資料表示,他不能被傳遞到業務層;po是持久層的資料表示,在特定情況下,例如hibernate中,他可以取代vo出現在業務層,但是不管po還是vo都必須限制在業務層內使用,最多到達web層的control,絕不能被擴散到view去。

form bean 和po之間的資料轉化是在action中進行滴。

建立資料表和修改資料表

建立表 sql中建立和刪除資料庫物件的語句被稱為資料定義語言 data definition language,ddl 操作這些物件中資料的語句被稱為資料操作語言 data manipulation language,dml 建立語句屬於ddl,用create table命令 create temp...

庫房資料表

已生成 2015 05 23 08 33 49 伺服器 postgresql 9.4 localhost 5432 資料庫 v9 架構 public 名稱 資料型別 非空?主鍵?預設注釋 autoid integer是是 nextval b warehouse autoid seq regclass...

資料表操作

1 建立資料表 create table if not exists table name column name data type,2 檢視資料表 show tables show tables from mysql 3 檢視資料表結構 show columns from tbl name 4 ...