投標(biāo)管理軟件開(kāi)發(fā)或者JSP的運(yùn)行,離不開(kāi)Servlet Engine(Servlet框架的實(shí)現(xiàn))。可是,很多人又開(kāi)始把企業(yè)應(yīng)用邏輯綁定到Servlet框架上。這種想法很愚蠢。什么叫把企業(yè)應(yīng)用邏輯綁定到Servlet框架呢? 所謂綁定,就是直接在“投標(biāo)管理軟件開(kāi)發(fā)”中處理業(yè)務(wù)邏輯,例如,計(jì)算保險(xiǎn)代理人的傭金,或者把框架中的Request參數(shù)傳遞到業(yè)務(wù)邏輯計(jì)算之中。
在投標(biāo)管理軟件開(kāi)發(fā)實(shí)踐中,這樣的錯(cuò)誤用法屢見(jiàn)不鮮。我將反復(fù)強(qiáng)調(diào)這個(gè)問(wèn)題。正的做法是,為了確保企業(yè)應(yīng)用邏輯的可移植性,我們應(yīng)該把Servlet框架作為企業(yè)應(yīng)用邏輯提供者與使用者之間的橋梁,而不是把Servlet框架作為企業(yè)應(yīng)用邏輯的一個(gè)不可分割的組成部分。基于Servlet框架,業(yè)界完善了動(dòng)態(tài)Web應(yīng)用程序的想法。一個(gè)動(dòng)態(tài)Web應(yīng)用程序可以獨(dú)立發(fā)布和部署,如果再加上數(shù)據(jù)訪問(wèn)的功能,它已經(jīng)可以作為一個(gè)簡(jiǎn)單應(yīng)用系統(tǒng)的架構(gòu)級(jí)方案了。
不過(guò),對(duì)于稍大規(guī)模的應(yīng)用系統(tǒng)來(lái)說(shuō),單純的Web應(yīng)用程序框架就顯得過(guò)于簡(jiǎn)單了。有一些技術(shù),可以充實(shí)這類稍大規(guī)模的應(yīng)用系統(tǒng)架構(gòu),例如,基于MVC架構(gòu)模式的Struts框架和實(shí)現(xiàn)OR Mapping功能的Hibernate框架。 Struts框架把動(dòng)態(tài)Web應(yīng)用程序中的代碼做了功能性的抽象和劃分:有的代碼屬于對(duì)象模型,有的屬于用戶界面,還有的屬于邏輯計(jì)算。經(jīng)過(guò)這樣的劃分,程序結(jié)構(gòu)顯得更加符合“模式化的想象”(隱喻)。
模式化的想象使人們的思維變得清晰和具體。這也是所有架構(gòu)的本質(zhì)。當(dāng)然,模式抽象只是Struts框架的一部分。和所有的框架一樣,基于模式抽象,Struts框架還提供了一些約束性的編程模型,例如,頁(yè)面流轉(zhuǎn)配置、Tag庫(kù)、Action映射等。Hibernate框架解決的則是OR Mapping問(wèn)題。這也是面向?qū)ο箝_(kāi)發(fā)的一項(xiàng)基礎(chǔ)技術(shù)。關(guān)于OR Mapping及Hibernate框架,讀者可以去閱讀相關(guān)的書(shū)籍。讓我感慨的是,在投標(biāo)管理軟件開(kāi)發(fā)實(shí)踐中,真正理解OR Mapping的人真是太少了。
我看到有很多人在抱怨OR Mapping框架的性能。他們一面抱怨,一面轉(zhuǎn)而選擇JDBC來(lái)直接處理數(shù)據(jù)訪問(wèn),這是一種嚴(yán)重的錯(cuò)誤。在下一節(jié)中,我會(huì)列舉一個(gè)反面的例子,你會(huì)明白這種想法是多么的失敗。 加入上面兩個(gè)架構(gòu)元素之后,動(dòng)態(tài)Web應(yīng)用程序看上去比較豐滿了??墒?,在處理真正的企業(yè)級(jí)應(yīng)用系統(tǒng)的時(shí)候,這種級(jí)別的架構(gòu)就遠(yuǎn)遠(yuǎn)不夠了。
不夠的意思,不是說(shuō)不能,而是說(shuō),這種架構(gòu)提供給物流協(xié)同軟件開(kāi)發(fā)的支持太少了。例如,沒(méi)有分布式計(jì)算的支持、沒(méi)有事務(wù)的支持、沒(méi)有安全的支持、沒(méi)有異步消息處理的支持,等等。這時(shí)候,業(yè)界出現(xiàn)了J2 EE規(guī)范,以及基于J2 EE規(guī)范的各種框架。 支持J2EE全部規(guī)范的框架,通常是個(gè)重量級(jí)的框架,它幾乎實(shí)現(xiàn)并提供了企業(yè)應(yīng)用所需的所有服務(wù)(目前,Struts和Hibernate技術(shù)框架的思想,也被納入了Java EE規(guī)范之中——JSF和JPA)。