楊慧 北京北大方正軟件技術學院
MVC模式在J2EE和.NET中的對比研究
楊慧 北京北大方正軟件技術學院
本文針對在多層分布式計算中,通過對MVC設計模式、J2EE及.NET的研究,系統探討了開發基于網絡的分布式計算工程(如企業級應用系統)的方法。
MODEL1;MODEL2;MVC設計模式;J2EE;.NET;EJB
本文以統計系統為例,針對統計系統高效靈活性、可維護性、可擴展性、可復用性、易用性等需求,通過對多層分布式計算、MVC模式、J2EE及.NET的研究,系統探討了開發基于網絡的分布式計算工程(如企業級應用系統)的方法。
1.1 由傳統的MODEL1發展到MODEL2
JAVA WEB應用的結構經歷了兩個階段,也就是從傳統的M O D E L 1發展到MODEL2。在MODEL1模式下,整個WEB應用全部由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求進行處理后可以直接做出響應,還可以用少量的JAVABEAN來處理數據庫連接、數據庫訪問等操作,在這種模式里JSP頁面身兼VIEW和CONTROLLER兩種角色,容易將控制邏輯和表現邏輯混雜在一起,使代碼的重用性降低,增加了應用的擴展性和維護的難度。由于這種模式的實現比較簡單、局限性強,適合開發小規模項目。
M O D E L 2也就是我們說的M V C(MODEL_VIEW_CONTROL)架構的設計模式是軟件設計的典型模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。在這種設計模式下,MODEL、VIEW和CONTROL三個部分各負責不同的功能,并將其劃分成不同功能的邏輯模塊,使模塊間的關聯最小化,因此,特別適用于基于網絡的分布式計算工程,如企業級應用系統。下面我們來詳細認識一下MVC模式的組成。
MODEL:模型,在MVC的三個部件中,模型擁有最多的處理任務。代表應用數據和控制這些數據的商業邏輯,負責處理由控制器傳遞過來的對數據的訪問請求,為視圖提供最終用以展現的數據,為控制部分提供方便的接口。通過模型,視圖可以訪問數據,并根據客戶端的要求來顯示數據。被模型返回的數據是中立的,也就是說模型與數據格式無關,這樣一個模型能為多個視圖提供數據。由于應用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。
VIEW:視圖,視圖是用戶看到并與之交互的界面,負責如何具體的展現模型的內容。當模型發生變化時,視圖將負責保持界面的一致性,并同時改變顯示的數據。對老式的Web應用程序來說,視圖就是由HTML元素組成的界面,在新式的Web應用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術已層出不窮。如何處理應用程序的界面變得越來越有挑戰性。MVC的好處之一是它能為你的應用程序處理很多不同的視圖。視圖也負責將用戶的交互信息傳遞給控制部分。在視圖中其實沒有真正的處理發生,不管這些數據是聯機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數據并允許用戶操縱的方式。
CONTROL:控制部分,處在視圖和模型之間,接受用戶的輸入并調用模型和視圖去完成用戶的需求。負責處理用戶請求和數據同步,是一系列接收用戶動作(比如鼠標和鍵盤的事件)的對象。結合模型和視圖,把客戶端的請求轉換成模型能夠理解并執行的請求,并且根據請求以及執行結果決定其后所要顯示的視圖。在傳統的圖形用戶界面,控制部分包括按鈕,菜單等等。在WEB應用程序中,可以是對HTTP請求的GET或者POST方法。基于用戶的請求和模型的需要,控制部分負責選擇相應的視圖將數據展現給用戶。
以上三者的關系在應用中我們說是相互關聯和控制的,程序利用三種模型的關系來更好的實現模塊的耦合。

圖1 M V C應用程序中模型、視、控制器三部分的關系
綜上所述,在M O D E L 2架構中,SERVLET作為前端控制器,負責接收客戶端發送的請求,在SERVLET中只包含控制邏輯和簡單的前端處理;然后調用后端JAVABEAN來完成實際的邏輯處理;最后,轉發到相應的JSP頁面處理顯示邏輯。我們從圖中可以看到,在MODEL2下JSP不再承擔控制器的責任,它僅僅是表現層角色,僅僅將結果呈現給用戶,JSP頁面的請求與SERVLET交互,而SERVLET負責與后臺的JAVABEAN通信,也就是說MODEL由JAVABEAN充當,VIEW由JSP頁面充當,而CONTROL由SERVLET充當。所以MVC更適合大規模軟件的開發,但出增加了應用開發的復雜程度。
1.2 MVC設計模式在軟件開發中的優勢
MVC并不是JAVA語言所特有的設計思想,也并不是WEB應用所特有的思想,它是所有面向對象程序設計語言都應該遵守的規范。
MVC給出了一個耦合松散的架構。對于MVC分別對應的三部分功能來講,用戶界面發生變動的可能性最大,控制部分變動次之,而業務邏輯相對是比較穩定的。通過使視圖完全獨立于控制部分和模型,可以輕松替換前端客戶程序。將控制部分和模型分開可以在不影響模型的情況下改變控制器,也可以在不影響控制部分的情況下改變模型。所以采用這種設計模式,不論在哪一部分發生改變,都能夠以最小的代價使系統能夠平穩過渡,不至于造成全局功能實現上的混亂,而且程序整體上結構清晰,性能穩定可靠,更易維護,伸縮性好,易于擴展、維護和代碼重用,更有利于在項目組內按照成員各自的擅長進行分工,使三個部分可以并行開發,加快項目進度,簡言之,以更快的速度開發更好的軟件。
從設計模式的角度來看,MVC思想非常類似于觀察者模式,但與觀察者模式存在少許差別:觀察者模式下觀察者和被觀察者可以是兩個互相對等的對象,但對于MVC思想而言,被觀察者往往只是單純數據體,而觀察者則是單純的視圖頁面。
基于組件的J2EE平臺提供了支持MVC設計模式很好的開發環境。模型可以通過EJB實現;視圖可以通過HTML頁面、JSP頁面及功能強大的applet展示給用戶; 控制部分則是 servlet、Java Bean 或 session bean 類。其模塊間的通信協議采用RMI/IIOP,數據庫連接部分是JDBC,運行環境是Java虛擬機(Java Virtual Machine),其中間語言是Java Byte Code。
模型部分,編寫業務邏輯時,可以將完成這些功能的業務邏輯放置在EJB中,這樣,我們就可以將精力集中在解決關鍵的業務邏輯問題上,而利用enterprise bean容器來支持低層服務,如安全,線程管理,事務管理,狀態管理,遠程數據訪問等。將業務邏輯與低層系統邏輯分開使容器可以在運行時創建和管理enterprise bean,而按照規范編寫的任何enterprise bean,都可以根據其在特定J2EE應用程序中的使用情況來對其事務管理或安全屬性進行配置,并可以輕松的部署到任何一個符合規范的容器中,也就是說,不必改變代碼,也不必重新編譯enterprise bean,即可實現組件重用。Enterprise bean 由接口和類組成。客戶端程序通過enterprise bean的home接口和遠程接口來訪問enterprise bean的方法。Home 接口提供了創建、刪除和定位enterprise bean 的方法,而遠程接口則提供了實現業務邏輯的方法。在部署時,容器由這些接口來創建類,使客戶能夠創建、刪除、定位或調用位于enterprise bean 上的業務邏輯方法。Enterprise beans有兩種:session bean和entity bean。前者代表與客戶程序的一個短暫的會話,也可執行數據庫讀寫操作,其內容包含會話狀態,而且是短暫的。如果服務器或者客戶程序崩潰,該session bean 就會丟失。Session beans 可以是有狀態的,也可以是無狀態的。一個有狀態的session b e a n包含客戶程序的會話狀態。有狀態session bean并不代表在一個持久數據存儲中的數據,但是它可以代表客戶程序訪問和更新數據。無狀態session bean沒有用于某個特定客戶程序的任何狀態信息,因此通常用于提供不保持任何特定狀態的服務器端行為。entity bean代表一個數據庫中的數據及作用于該數據的方法。在關系型數據庫中,每行數據都由一個bean 來代表。entity beans 是事務性的,并且是長壽命的,只要數據留在數據庫中,entity bean 就存在,因此可以被很容易地用于關系型數據庫,而不僅限于對象數據庫。
視圖部分,如果應用的是HTML頁面,略懂計算機的人就可以更新它。如果使用的是JSP 頁面,將控制器的代碼放到一個Java Bean 或session bean類中,或使用動作標記(action tags),這樣,JSP 頁面就可以僅包含JSP 代碼。視圖部分也包括applet和各種腳本語言,功能強大而且界面友好易用。
控制部分,通常是在servlet中實現的。Servlet是一種獨立于平臺和協議的服務器端的Java應用程序,可以生成動態的Web頁面。與傳統的從命令行啟動的Java應用程序不同,Servlet由Web服務器進行加載,該Web服務器必須包含支持Servlet的Java虛擬機。盡管JSP文件最終也將編譯成servlet,但從整個系統的角度來講,用servlet實現控制部分將使系統結構清晰,各個部分銜接會更好。
綜合我們對J2EE應用的了解,我們知道對于大型軟件系統開發,采用J2EE應用架構則有很大的優勢。
.NET同樣提供了出色的實現這種設計模式的規范和集成開發環境,以asp.net為例,我們可以在.ASPX文件中開發用戶接口來實現視圖,控制部分在邏輯功能代碼(code-behind)文件(如*.aspx.vb或者*.aspx.cs)中實現,模型可以通過程序代碼實現(如*.cs),程序代碼最終都打包成COM+組件,相比原來的ASP解釋執行,大大提升了性能。其模塊間的通信協議通常是DCOM或者SOAP,數據庫連接部分采用ADO.NET,運行環境是Common Language Runtime,其中間語言是MSIL。
將數據展現從控制部分中分離出來提高了代碼的重用性,而將模型從對其操作的控制部分分離出來可以設計一個與后臺存儲數據無關的系統,也就是說,提供給模型的數據是存儲在SQL Server或是Oracle數據庫中,還是存儲在一組XML文檔中,對于基于MVC設計模式的系統將是透明的。
性能方面,盡管從控制部分和視圖中訪問模型是獨立于具體數據庫的,但并不意味著模型不能被優化。因為ADO Data Set不關心數據源,通過采用數據庫專有的優點不用打破這種模式就可以提高系統性能。例如,相比在控制部分代碼文件中使用嵌入的SQL Select語句,我們可以使用存儲過程根據其參數返回數值,效果會好很多,因為存儲過程不僅僅是被數據庫中預編譯好的,它們還有一個預先確定的執行路徑,所以其執行得更快,效率更高。
模型在數據訪問時,我們可將所有的代碼合并在一個單獨的數據訪問對象中,由它來完成該系統所有的數據訪問。集中的數據訪問提升了代碼重用性,更重要的是,通過使用實際容量設置連接可以保證應用程序使用連接池,從而提高效率。
控制器部分,.NET通常直接地請求服務。取代身為子控制器的一個服務,它是進入ASP.NET應用程序的主要切入點。
以MVC設計模式為出發點,結合J2EE和.NET的相應特點,我們總結出如表1所示:

表1 MVC在J2EE和.NET中的實現方法
綜上所述,可以得出結論:
通過對多層分布式計算,結合MVC的設計思想,充分利用J2EE架構的優勢,使統計系統結構清晰,穩定高效,易維護,易擴展;滿足了統計系統高效靈活性、可維護性、可擴展性、可復用性、易用性等需求。在開發基于網絡的分布式計算工程(如企業級應用系統)的時候,充分考慮到了系統將來的可擴充性以及可移植性,以便系統的進一步完善。
10.3969/j.issn.1001-8972.2011.24.041
楊慧,女,副教授,清華大學在職研究生,現在北京北大方正軟件技術學院擔任教師。