J2EE開發(fā)框架發(fā)展簡史 開源框架的出現(xiàn)
Java2企業(yè)版為中間件領(lǐng)域思想的統(tǒng)一上發(fā)揮了很大的作用。比如,J2EE為分布式事務(wù)管理、目錄服務(wù)和消息服務(wù)提供了一套標(biāo)準(zhǔn)的編程接口。J2EE的基礎(chǔ)——Java2標(biāo)準(zhǔn)版(J2SE) ,成功地為Java提供了一套訪問關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)。
但是,就像本文中“J2EE缺乏對編程的支持”提到的一樣,J2EE這個(gè)平臺(tái)沒有能夠提供一個(gè)令人滿意的應(yīng)用程序編程模型(application programming model)。
Sun公司和一些大的應(yīng)用服務(wù)器供應(yīng)商都想用開發(fā)工具來降低J2EE開發(fā)的復(fù)雜性,但是這些工具沒有其他的JAVA 開發(fā)工具優(yōu)秀,后者有先進(jìn)的重構(gòu)工具,和.NET平臺(tái)相比,J2EE的工具支持顯得很遜色。
很多J2EE開發(fā)工具自動(dòng)產(chǎn)生的代碼像這些工具本身同樣復(fù)雜。在開源社區(qū)很多小型J2EE開發(fā)者選擇了另外一種開發(fā)方式—— 一些可以降低J2EE開發(fā)難度的開發(fā)框架,較為流行的比如:Struts, Hibernate, 和 Spring 架構(gòu),他們在當(dāng)今很多J2EE項(xiàng)目中扮演著重要角色。
為什么要采用框架?
框架是由一些類組成,正是這些類為應(yīng)用程序提供了一個(gè)可重用的設(shè)計(jì),或者我們經(jīng)常提到的,應(yīng)用程序中的一層。應(yīng)用程序代碼訪問類庫從而執(zhí)行任務(wù),而框架是調(diào)用應(yīng)用程序代碼,從而管理程序的流程。這就是經(jīng)常說道的好萊塢原則:“不要試圖聯(lián)系我們,我們到時(shí)候自會(huì)通知你?!遍_發(fā)者寫的程序在運(yùn)行時(shí)由框架調(diào)用。
設(shè)計(jì)一個(gè)在各種未知背景下都可以使用的框架是很有挑戰(zhàn)性的??蚣芎苓m合在復(fù)雜的J2EE開發(fā)中使用,它可以為開發(fā)者提供一個(gè)簡單易用的模型。
采用一個(gè)經(jīng)過良好設(shè)計(jì)的開源框架有很多好處:
◆在好的框架下,開發(fā)者只需要寫一些必須的代碼;他們不需要直接接觸底層的API。 這一點(diǎn)很重要。
◆經(jīng)過良好設(shè)計(jì)的框架可以為程序提供清晰的結(jié)構(gòu)并且提高程序的內(nèi)聚性。好清晰的結(jié)構(gòu)使得其他人可以更容易加入項(xiàng)目。
◆一個(gè)容易使用的框架可以通過一些例子和文檔為用戶提供最佳實(shí)踐。
◆采用成功的框架的代碼比自己的代碼容易測試
◆框架只有提供了一些值得使用的功能才會(huì)變得流行。J2EE工程只有真正需要框架的時(shí)候才會(huì)用它,而自己的框架并不是這樣,后者是處于統(tǒng)治地位的。
J2EE本身也提供了一些框架。比如, Enterprise Java-Beans (EJB) container或者 Servlet engine,二者都運(yùn)用了“ 采用了好萊塢原則”這個(gè)思想,并采用運(yùn)行時(shí)調(diào)用來管理對象。像Struts這些開源web應(yīng)用框架正是建立在這兩個(gè)框架的基礎(chǔ)上的,本文討論的重點(diǎn)也是像Struts這樣建立在J2EE上的開發(fā)框架,他們?yōu)殚_發(fā)者提供了更為簡單的模型,和其他的一些好處。
開源框架的出現(xiàn)
很多大型的J2EE項(xiàng)目都用自己的內(nèi)部框架來隱藏平臺(tái)的復(fù)雜性,直到最近人們才逐漸發(fā)現(xiàn)一些在很多項(xiàng)目中都存在的共有的難題,這些難題都可以由一個(gè)較為統(tǒng)一的解決方案來解決。而有的框架正好可以充當(dāng)這些問題的解決方案?,F(xiàn)在有種很明顯的趨勢:與從前的內(nèi)部框架相比,這些框架將成為這些難題的更加“標(biāo)準(zhǔn)化 ”的解決方案。
J2EE平臺(tái)的日益成熟是這些框架流行的一個(gè)原因。開發(fā)者知道有些地方是J2EE的標(biāo)準(zhǔn)API無能為力的,依他們的經(jīng)驗(yàn)來看,要彌補(bǔ)這個(gè)缺陷是很困難的。與此同時(shí),一些優(yōu)秀的開源框架可供使用,它們提供了極為豐富的技術(shù)文檔,在它們背后還有一個(gè)專業(yè)的團(tuán)隊(duì)做支持,并且一切都是免費(fèi)的。
Struts
Struts,在web應(yīng)用程序產(chǎn)生時(shí)就有的開源框架。在1999-2000年,開發(fā)者們意識(shí)到JSP“Model1”的缺陷,JSP中充斥著請求處理代碼和靜態(tài)數(shù)據(jù)模板,這意味著你不得不把業(yè)務(wù)邏輯和復(fù)雜的HTML以及其他的標(biāo)簽混到一起。
那個(gè)時(shí)候還沒有標(biāo)準(zhǔn)的框架和J2EE的標(biāo)準(zhǔn)支持,要解決這個(gè)問題開發(fā)者就得自己實(shí)現(xiàn)前端控制器,這樣可以把業(yè)務(wù)邏輯分離到j(luò)ava類中,從而可以減輕對JSP的維護(hù)難度。
前端控制器模式經(jīng)常運(yùn)用在MVC架構(gòu)中,MVC模式在OO語言的GUI開發(fā)中經(jīng)常使用(這個(gè)名字總是讓人誤解,WEB MVC中的視圖是從模型中“拉”數(shù)據(jù);而在經(jīng)典MVC中,模型把事件“推向”視圖)。
最初的前端控制器實(shí)現(xiàn)質(zhì)量參差不齊。2001~2002年間,Apache開源組織(http://struts.apache.org)發(fā)布的Struts改變了這個(gè)狀況,雖然它并非一個(gè)完美的框架,但已經(jīng)足夠使其成為該領(lǐng)域事實(shí)上的標(biāo)準(zhǔn)。
Struts向人們展示了開源框架的一些優(yōu)點(diǎn),比如,新手可以很容易地熟悉它的結(jié)構(gòu)。2002年末,它成立很多J2EE項(xiàng)目很自然的選擇,每一個(gè)認(rèn)真的J2EE開發(fā)者都會(huì)對它很熟悉。
Struts幾乎用在每一個(gè)J2EE項(xiàng)目中,這使得它成為J2EE架構(gòu)的一個(gè)重要組成部分。甚至很多保守的組織也將其作為軟件底層的一部分,并同意接受Apache的開源協(xié)議條款。
Hibernate
下一個(gè)倒下的多骨諾米牌就是持久化。J2EE提供了兩個(gè)持久化的手段:JDBC,它是J2SE中訪問關(guān)系數(shù)據(jù)庫系統(tǒng)的標(biāo)準(zhǔn)API;另一個(gè)是實(shí)體Beans ,它是EJB中專門模型化持久化實(shí)體的組件。
JDBC以一種錯(cuò)誤的編程模型來強(qiáng)制開發(fā)者用Java代碼來處理關(guān)系思想。而實(shí)體beans,先不說Sun和其他主要的J2EE供應(yīng)商的吹噓,給人很笨重的感覺:起初這門技術(shù)的應(yīng)用范圍很窄,連持久對象間的關(guān)系都不能處理。它使得應(yīng)用程序難于測試,并且使用了一個(gè)很糟糕的查詢語言。直到2003年,即使EJB2.0和2.1做了很多改進(jìn),開發(fā)者們卻很少用它。
早期的嘗試。持久化問題的解決方案是由關(guān)系-對象映射(ORM)來解決的,它可以透明地持久化普通java對象(POJO)。該思想在注釋中有解釋。雖然這種方案并不是專屬java的。但相對與其他的社區(qū)而言比如.NET,ORM在java社區(qū)更加流行(.NET開發(fā)者總是對之抱有懷疑的態(tài)度)。
【編輯推薦】