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