其實,就算用java建造一個不是很煩瑣的web應(yīng)用程序,也不是件輕松的事情。當為一個應(yīng)用程序建造一個構(gòu)架時有許多事情需要考慮。從高層來說,開發(fā)者需要考慮:怎樣建立用戶接口(user interfaces)?在哪里處理業(yè)務(wù)邏輯?和怎樣持久化應(yīng)用數(shù)據(jù)。這三層每一層都有它們各自的問題需要回答。 各個層次應(yīng)該使用什么技術(shù)?怎樣才能把應(yīng)用程序設(shè)計得松耦合和能靈活改變?構(gòu)架答應(yīng)層的替換不會影響到其它層嗎?應(yīng)用程序怎樣處理容器級的服務(wù)(container level services),比如事務(wù)處理(transactions)?
當為你的web應(yīng)用程序創(chuàng)建一個構(gòu)架時,需要涉及到相當多的問題。幸運的是,已經(jīng)有不少開發(fā)者已經(jīng)碰到過這類重復(fù)發(fā)生的問題,并且建立了處理這類問題的框架。一個好框架具備以下幾點: 減輕開發(fā)者處理復(fù)雜的問題的負擔(“不重復(fù)發(fā)明輪子”);內(nèi)部定義為可擴展的;有一個強大的用戶群支持。框架通常能夠很好的解決一方面的問題。然而,你的應(yīng)用程序有幾個層可能都需要它們各自的框架。就如解決你的用戶接口(UI)問題時你就不應(yīng)該把事務(wù)邏輯和持久化邏輯摻雜進來。例如,你不應(yīng)該在控制器(controller)里面寫jdbc代碼,使它包含有業(yè)務(wù)邏輯,這不是控制器應(yīng)該提供的功能。它應(yīng)該是輕量級的,代理來自用戶接口(UI)外的調(diào)用請求給其它服務(wù)于這些請求的應(yīng)用層。好的框架自然的形成代碼如何分布的指導(dǎo)。更重要的是,框架減輕開發(fā)者從頭開始寫像持久層這樣的代碼的痛苦,使他們專注于對客戶來說很重要的應(yīng)用邏輯。
這篇文章將討論怎樣組合幾個聞名的框架去做到松耦合的目的,怎樣建立你的構(gòu)架,怎樣讓你的各個應(yīng)用層保持一致。富于挑戰(zhàn)的是:組合這些框架使得每一層都以一種松耦合的方式彼此溝通,而與底層的技術(shù)無關(guān)。這篇文章將使用3種流行的開源框架來討論組合框架的策略。表現(xiàn)層我們將使用Struts(http://jakarta.apache.org/struts);業(yè)務(wù)層我們將使用SPRing(http://www.springframework.org/);持久層使用Hibrenate(http://www.hibernate.org/).你也可以在你的應(yīng)用程序中替換這些框架中的任何一種而得到同樣的效果。圖1展示了當這些框架組合在一起時從高層看是什么樣子。
圖1用Struts, Spring, 和 Hibernate框架構(gòu)建的概覽
應(yīng)用程序的分層 (application Layering)
大多數(shù)不復(fù)雜的web應(yīng)用都能被分成至少4個各負其責的層次。這些層次是:表現(xiàn)層(presentation)、持久層(persistence)、業(yè)務(wù)層(business)、領(lǐng)域模型層(domain model)。每層在應(yīng)用程序中都有明確的責任,不應(yīng)該和其它層混淆功能。每一應(yīng)用層應(yīng)該彼此獨立但要給他們之間放一個通訊接口。讓我們從審閱各個層開始,討論這些層應(yīng)該提供什么和不應(yīng)該提供什么。
表現(xiàn)層 (The Presentation Layer)
在一個典型的web應(yīng)用的一端是表現(xiàn)層。很多Java開發(fā)者也理解Struts所提供的。然而,太常見的是,他們把像業(yè)務(wù)邏輯之類的耦合的代碼放進了一個org.apache.struts.Action。所以,讓我們在像Struts這樣一個框架應(yīng)該提供什么上取得一致意見。這兒是Struts負責的:
為用戶治理請求和響應(yīng);
提供一個控制器(controller)代理調(diào)用業(yè)務(wù)邏輯和其它上層處理;
處理從其它層擲出給一個Struts Action的異常;
為顯示提供一個模型;
執(zhí)行用戶接口(UI)驗證。
這兒是一些經(jīng)常用Struts編寫的但是卻不應(yīng)該和Struts表現(xiàn)層相伴的項目:
直接和數(shù)據(jù)庫通訊,比如JDBC調(diào)用;
業(yè)務(wù)邏輯和與你的應(yīng)用程序相關(guān)的驗證;
事務(wù)治理;
在表現(xiàn)層中引入這種代碼將導(dǎo)致典型耦合(type coupling)和討厭的維護。
持久層 (The Persistence Layer )
在典型web應(yīng)用的另一端是持久層。這通常是使事情迅速失控的地方。開發(fā)者低估了構(gòu)建他們自己的持久層框架的挑戰(zhàn)性。一般來說,機構(gòu)內(nèi)部自己寫的持久層不僅需要大量的開發(fā)時間,而且還經(jīng)常缺少功能和變得難以控制。有幾個開源的“對象-關(guān)系映射”(ORM)框架非常解決問題。尤其是,Hibernate框架為java提供了"對象-關(guān)系持久化"(object-to-relational persistence)機制和查詢服務(wù)。Hibernate對那些已經(jīng)熟悉了SQL和JDBC API的Java開發(fā)者有一個適中的學(xué)習(xí)曲線。Hibernate持久對象是基于簡單舊式Java對象(POJO)和Java集合(Java collections)。此外,使用Hibernate并不妨礙你正在使用的IDE。下面的列表包含了你該寫在一個持久層框架里的代碼類型:
查詢相關(guān)的信息成為對象。Hibernate通過一種叫作HQL的面向?qū)ο螅∣O)的查詢語言或者使用條件表達式API(eXPressive criteria API)來做這個事情。 HQL非常類似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。有一些新的專用的HQL語言成分要學(xué);不過,它們輕易理解而且文檔做得好。HQL是一種使用來查詢對象的自然語言,花很小的代價就能學(xué)習(xí)它。
保存、更新、刪除儲存在數(shù)據(jù)庫中的信息。
像Hibernate這樣的高級“對象-關(guān)系”映射(object-to-relational mapping)框架提供對大多數(shù)主流SQL數(shù)據(jù)庫的支持,它們支持“父/子”(parent/child)關(guān)系、事務(wù)處理、繼續(xù)和多態(tài)。
新聞熱點
疑難解答