第三部分:MVCD模型
在上一節中,從一般的原則上介紹了兩種Web應用模型,但是如何理解和把握這樣的模型,將不同的Web技術正確應用到Web程序不同的功能模塊中是一個非常實際的話題。下面就在實際編程中如何去掌握Web編程模型做一些分析。
1、兩層客戶/服務器模型
圖11、兩層客戶/服務器模型
Web應用程序天生是一種客戶/服務器應用程序,在ASP(Application Service Provider)逐漸成為Internet應用發展的一個重要方向的時候,使用哪一種編程模型來實現Web應用程序還處於探索之中。上面介紹的微軟的DNA結構和Java編程結構就是人們在ASP(Application Service Provider)編程模型上進行探索的結果,但是由於這些技術出現比較新、掌握起來也有一些難度,所以許多編程人員采用了使用ASP或是JSP中嵌入“SQL”來實現數據存取和一些相關邏輯,如圖11所示。
這樣的編程模型有對一些小型系統比較合適,因為不需要太復雜的技術,技術人員比較好找,實現起來也比較快。但是,這種編程模型缺點還是比較明顯的:維護困難、重用困難、大型系統中難以管理。
要解決該模型問題的關鍵是,將邏輯層抽象出來。但是,在以數據中心編程中,數據庫不但提供基本的數據存取功能,而且與SQL豐富的表達能力一起提供強大的邏輯表達能力;再上節介紹的圖9、圖10所示兩種模型掌握起來有一些難度,所以出現了該模型的一個改良版本,如圖12所示。
圖12、改良的客戶/服務器模型
組成在該改良的模型中,為數據庫中的主要的表都建立了一個類,JSP/ASP通過該類實現對數據庫表的操作。這個模型一個方面實現了SQL語句封裝,方便了程序的維護;另一個方面也提高了系統的重用性,即對Table類的重用。
但是,由於大多數數據庫操作都是針對多數據表的操作,如果采用單表的方式來完成邏輯,未免有些浪費數據庫與SQL的邏輯功能。另外,由於系統沒有實現邏輯層的抽象,不能解決上面提高關鍵問題。
2、MVC模型的介紹
在傳統的面向對象編程中,我們曾經接觸過MVC模型,如圖12所示。
圖13、MVC模型
在該模型中,應用程序分為三個組成部分:
View: 這是用戶界面部分,與Web應用程序一樣,主管應用程序與人之間的接口:一個方面它為用戶提供了輸入手段,並觸發應用邏輯運行;另一個方面,它又將邏輯運行的結果以某種形式顯示給用戶。
Controller: 該部分是用戶界面與Model的接口;一個方面它解釋來自於view的輸入,將其解釋成立系統能夠理解的對象,同時它也識別用戶動作,並將其解釋對Model特定方法的調用;另一個方面,它也處理來自於Model的事件和Model邏輯執行的結果,調用適當View為用戶提供反饋。
Model: 這是整個模型的核心,它表示的是解決方案空間的真正的邏輯。它采用面向對象的方法,將問題領域中的對象抽象為應用程序對象。在這些抽象的對象中封裝了對象的屬性和這些對象所隱含的邏輯。
上面所示的編程模型中,在應用程序執行過程中,數據就保存在Model的實例中,也就是保存在內存中。當用戶需要保存執行的結果時,將模型中的數據保存為特定格式的文件。在用Java實現模型時,可以直接使用Java對象的Serializable特性來保存對象。這種模型適合一些工具軟件的開發,如Case工具或是CAD工具。這些工具軟件所具有一個共同特征是模型本身比較復雜、數據量不大而且是單用戶單模型實例操作。
Web應用程序有著與工具類應用程序不同的特點:數據量大、多用戶並行操著。如果象上面一樣采用面向對象模型,則往往是多模型實例同時存在,上面的模型不再適合於這樣的Web應用程序。
雖然MVC模型不適用於Web應用,但是它為Web應用程序的開發提供了一些借鑒意義。再該模型中提供了對模型的抽象,也就是邏輯的抽象。如果改良該模型,在內存中不保留對象的屬性值,並且增加一個數據層,將模型與數據庫連接起來,可能是一個好辦法,如圖14所示。
圖14、調整後的MVC模型(MVCD:Model_View_Control_Data)
如何用Java實現圖14所示的MVCD模型
3、WCS、MPE模型介紹
圖15所示的是在WCS和MPE中所采用的編程模型。該編程模型將JSP、Servlet、JavaBean和JDBC技術有機的結合在一起,基本上實現了圖14所示的MVCD模型。
圖15、JICPD(JSP_IC_COMMAND_PO_DATA)模型
JSP:JSP在本模型中主要起著用戶界面的功能,掌管所有的輸入和輸出。在該部分中所使用的技術包括。
HTML:用戶從浏覽器上所看見的內容主要是以HTML的形式提供的,只是有一些內容是靜態的,而有一些內容是由JSP動態產生的。
Applet:這是一種客戶端程序技術,它作為一種可以獨立運行的程序模塊嵌入到HTML中。
Java Script:這裡的Java Script指的是客戶端腳本技術,主要在客戶端提供一些動態功能和實現輸入格式的檢查。
JSP:這是一種在服務器端執行的腳本技術,它的主要功能是接受服務器端邏輯運算的結果,動態的生成HTML作為對浏覽器端請求的響應。
IC (Interaction Controller):IC是以Servlet技術實現的。IC是介於事務邏輯和用戶界面之間的一個層次,該層主要起用戶界面和事務邏輯之間的樞紐作用。從JSP上接受的用戶輸入,因為是以HTTP請求的形式發送到服務器端,該HTTP請求的具體內容是什麼、它提供了哪些參數需要在服務器端進行解析,然後才能決定為了響應該請求要執行什麼事務邏輯;事務邏輯在執行完成之後,作為對某個用戶請求的響應,它需要將執行的結果以HTTP響應的形式發送到客戶端。IC正是起著上面所示的兩種作用的程序單元,它一個方面響應來自於JSP的請求,並將其解釋為制定的Command調用;另一個方面它將Command執行的結果傳遞給特定的JSP並調用該JSP作為給用戶的響應。
Command:Command是以JavaBeans技術實現的。在一個應用程序中,比較穩定且起著核心作用的是事務邏輯,而Command就是用來實現事務邏輯的。在這樣的Web應用程序中,將系統的事務邏輯封裝成許多獨立的 Command,這些Command一個方面作為對IC的響應,另一個方面它完成了邏輯與數據庫對象PO的結合。
PO:這是一個特殊的Java Class,它在該模型中起著應用與數據庫之間的橋梁作用。Web應用程序大多都有豐富的數據,都需要與數據庫進行連接。Command對數據庫進行調用所需的基本功能都封裝在PO中。
DataBean:如圖所示,JSP、IC、Command與PO之間是一種功能提供者與調用者之間的關系,那麼如何傳遞參數呢。DataBean便是這樣的一個解決方案,它將這些功能模塊間傳遞的參數抽象成對象。
4、對JICPD模型的改進(JIMPD)
在圖15所示的模型中,系統抽象出了邏輯層,即Command層。但是,系統並沒有將其所有的Command和DataBean有機的整合起來,即開發者看不見一個完整的對象模型,我認為這對面向對象的開發是一個損失。因為,如果一個好的面向對象模型,不但為數據庫的設計提供依據,而其也為Command的設計和組織提供了一個依據,並且也將數據庫與Command的關系完整的表達出來。所以提高該模型性能的關鍵就是增加一個模型層,將Command與Databean封裝在模型中,如圖16所示。
圖16、JIMPD模型