原文: struts+spring+hibernate 組裝web應(yīng)用 用spring、Hibernate、Struts組建輕量級(jí)架構(gòu)
這兒是一些經(jīng)常用Struts編寫的但是卻不應(yīng)該和Struts表現(xiàn)層相伴的項(xiàng)目:
直接和數(shù)據(jù)庫(kù)通訊,比如JDBC調(diào)用; 業(yè)務(wù)邏輯和與你的應(yīng)用程序相關(guān)的驗(yàn)證; 事務(wù)管理;
在表現(xiàn)層中引入這種代碼將導(dǎo)致典型耦合(type coupling)和討厭的維護(hù)。
這篇文章的后面將用例子來把Spring使用這些概念的方法說得更清楚一些。業(yè)務(wù)層應(yīng)該負(fù)責(zé)下面這些事情:
處理應(yīng)用程序的業(yè)務(wù)邏輯和業(yè)務(wù)驗(yàn)證; 管理事務(wù); 預(yù)留和其它層交互的接口; 管理業(yè)務(wù)層對(duì)象之間的依賴; 增加在表現(xiàn)層和持久層之間的靈活性,使它們互不直接通訊; 從表現(xiàn)層中提供一個(gè)上下文(context)給業(yè)務(wù)層獲得業(yè)務(wù)服務(wù)(business services ); 管理從業(yè)務(wù)邏輯到持久層的實(shí)現(xiàn)。
在典型web應(yīng)用的另一端是持久層。這通常是使事情迅速失控的地方。開發(fā)者低估了構(gòu)建他們自己的持久層框架的挑戰(zhàn)性。一般來說,機(jī)構(gòu)內(nèi)部自己寫的持久層不僅需要大量的開發(fā)時(shí)間,而且還經(jīng)常缺少功能和變得難以控制。有幾個(gè)開源的“對(duì)象-關(guān)系映射”(ORM)框架非常解決問題。尤其是,Hibernate框架為java提供了"對(duì)象-關(guān)系持久化"(object-to-relational persistence)機(jī)制和查詢服務(wù)。Hibernate對(duì)那些已經(jīng)熟悉了SQL和JDBC API的Java開發(fā)者有一個(gè)適中的學(xué)習(xí)曲線。Hibernate持久對(duì)象是基于簡(jiǎn)單舊式Java對(duì)象(POJO)和Java集合(Java collections)。此外,使用Hibernate并不妨礙你正在使用的IDE。下面的列表包含了你該寫在一個(gè)持久層框架里的代碼類型:
查詢相關(guān)的信息成為對(duì)象。Hibernate通過一種叫作HQL的面向?qū)ο螅∣O)的查詢語(yǔ)言或者使用條件表達(dá)式API(expressive criteria API)來做這個(gè)事情。 HQL非常類似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。有一些新的專用的HQL語(yǔ)言成分要學(xué);不過,它們?nèi)菀桌斫舛椅臋n做得好。HQL是一種使用來查詢對(duì)象的自然語(yǔ)言,花很小的代價(jià)就能學(xué)習(xí)它。
保存、更新、刪除儲(chǔ)存在數(shù)據(jù)庫(kù)中的信息。
像Hibernate這樣的高級(jí)“對(duì)象-關(guān)系”映射(object-to-relational mapping)框架提供對(duì)大多數(shù)主流SQL數(shù)據(jù)庫(kù)的支持,它們支持“父/子”(parent/child)關(guān)系、事務(wù)處理、繼承和多態(tài)。
這兒是一些應(yīng)該在持久層里被避免的項(xiàng)目:
業(yè)務(wù)邏輯應(yīng)該在你的應(yīng)用的一個(gè)高一些的層次里。持久層里僅僅允許數(shù)據(jù)存取操作。
你不應(yīng)該把持久層邏輯(persistence logic)和你的表現(xiàn)層邏輯(presentation logic)攪在一起。避免像JSPs或基于servlet的類這些表現(xiàn)層組件里的邏輯和數(shù)據(jù)存取直接通訊。通過把持久層邏輯隔離進(jìn)它自己的層,應(yīng)用程序變得易于修改而不會(huì)影響在其它層的代碼。例如:Hebernate能夠被其它持久層框架或者API代替而不會(huì)修改在其它任何層的代碼。