鄭建華 朱蓉 邱振國
摘 要: 控制器在MVC模式中起著重要作用。分析了J2EE中MVC模式的實現(xiàn)方式,指出了經典的基于Servlet控制器的不足,分析了Struts2中控制器的核心原理。提出了一種基于門面模式和簡單工廠模式的輕量級控制器框架,將其命名為“1+N”模式控制器。該控制器主要包括核心控制器和業(yè)務控制器,由核心控制器統(tǒng)一響應客戶前端的請求,并將請求轉換到相應的業(yè)務控制器進行處理。給出了該框架中核心類的源代碼。該框架易于使用且具有較好的可擴展性和可維護性。
關鍵詞: MVC; 控制器; 門面模式; 簡單工廠模式; 核心控制器
中圖分類號:TP311 文獻標志碼:A 文章編號:1006-8228(2015)04-43-03
Abstract: The controller plays an important role in the MVC mode, this paper analyzes the implementation of the MVC model in J2EE, poins out the drawback of the classic controller based on Servlet and analyzes the core principle of the controller in Struts2. Then proposes a framework of lightweight controller based on Facade pattern and simple factory pattern, which named as “1+N” controller. The controller framework incudes core controller and business controller. The core controller responses the client request unified and then transfers the request to the business controller to process. The paper gives the source code of the core class in the framework. The framework is easy to use and has good scalability and maintainability.
Key words: MVC; controller; facade pattern; simple factory pattern; core controller
0 引言
當前信息化水平已成為衡量一個國家現(xiàn)代化水平和綜合國力的重要標志。信息化建設離不開系統(tǒng)的建設,傳統(tǒng)的Web應用系統(tǒng)會在表現(xiàn)層包含管理用戶交互的代碼,這樣對于整個應用系統(tǒng)來說,它的業(yè)務邏輯、控制邏輯和運行狀態(tài)等都很難被重用。MVC模式解耦了業(yè)務邏輯、控制邏輯,提高了代碼重用,又能使系統(tǒng)易于維護和修改[1]。
然而目前的研究更多是關注模型層和業(yè)務邏輯層,對MVC中控制器的研究較少。在目前被廣泛使用的基于J2EE的Web開發(fā)方式中,控制器主要是依靠Serlvet實現(xiàn),而經典的Serlvet控制器實現(xiàn)方式存在諸如Serlvet類過多,web.xml配置復雜等缺點。雖然Struts2.0提供了一種控制器實現(xiàn)方式,但是Struts2.0的復雜性對于初學者有較高難度。本研究基于門面模式和簡單工廠模式提出一種輕量級的“1+N”控制器框架,并給出了核心類的關鍵實現(xiàn)代碼。
1 MVC模式簡介
模型(Model)-視圖(View)-控制器(Controller)(MVC)[2]是Xerox PARC在八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設計模式,至今已被廣泛使用[3]。MVC把交互系統(tǒng)的組成分解成模型、視圖、控制器三種組件。
模型組件封裝了應用程序的核心數(shù)據(jù),以及這些數(shù)據(jù)的訪問和修改的業(yè)務規(guī)則,它表達了程序所使用的數(shù)據(jù)和生成數(shù)據(jù)的運行狀態(tài),它獨立于具體的界面表達和I/O操作。
視圖組件把模型數(shù)據(jù)及邏輯關系和狀態(tài)的信息以特定形式展示給用戶,主要負責如何表示數(shù)據(jù),對于相同的信息可以有多個不同的顯示形式,并當模型改變時,維護表示的一致性。視圖也負責把用戶動作傳遞給控制器。
控制組件負責模型和視圖之間的交互,控制對用戶輸入的響應方式和流程,確保視圖與模型間的對應聯(lián)系。它接受用戶的輸入,將輸入反饋給模型,進而實現(xiàn)對模型的計算控制,同時又將模型的改變及時反映在視圖上,使模型和視圖協(xié)調。
模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖,模型數(shù)據(jù)發(fā)生變化,控制器都會將變化通知所有的視圖,導致顯示的更新,實現(xiàn)了數(shù)據(jù)層與表示層的分離,這使得程序開發(fā)更加靈活,并且可以減少重復性代碼,實現(xiàn)代碼重用,易于維護和修改。
2 J2EE中MVC模式實現(xiàn)及不足
2.1 基于JSP+Sevlet的MVC模式實現(xiàn)
MVC模式目前被廣泛應用于Web系統(tǒng)開發(fā)。比如有文獻研究了.Net平臺下的基于MVC模式的Web應用開發(fā)[4],而在J2EE體系中,其應用也越來越廣泛[5]。
J2EE中經典MVC模式采用的是基于Jsp+Servlet+JavaBean的實現(xiàn),由Jsp頁面實現(xiàn)視圖(View),負責前臺的展示;JavaBean實現(xiàn)模型(model),處理業(yè)務邏輯;由Servlet實現(xiàn)控制器(Controller),負責業(yè)務層和視圖層的協(xié)調控制。
圖1展示了在線商城系統(tǒng)的基于Jsp+Servlet+JavaBean的J2EE中MVC模式的實現(xiàn)過程,整個框架的作用過程為:①Jsp頁面向Servlet發(fā)送請求;②Servlet接收到Jsp請求后向JavaBean模型發(fā)送業(yè)務請求;③然后JavaBean進行相關業(yè)務處理,將返回處理結果到Servlet;④最后由Servlet根據(jù)結果顯示要求,返回到不同的展示Jsp頁面。比如圖1中的LoginServlet可能將結果返回到Login.jsp,Succ.jsp,Error.jsp,即一個控制器可能與多個視圖關聯(lián),而視圖Jsp的展示結果是與模型JavaBean保持協(xié)同一致的。
通過以上方式較好地實現(xiàn)了三個層次功能的解耦,易于實現(xiàn)代碼的維護和修改。
2.2 經典Servlet的控制器實現(xiàn)與不足
按照MVC模式的劃分,在J2EE中Controller(控制器)由Servlet完成,使MVC模式中的三部分之間耦合性降到最低,最大限度地將Web應用系統(tǒng)中控制與業(yè)務邏輯分開。Servlet作為整個系統(tǒng)架構的交通樞紐,起著調度作用,其實JSP在執(zhí)行前先被編譯成字節(jié)碼,最終以Servlet執(zhí)行碼形式存在。由此可知Servlet在整個J2EE體系結構中起主要作用。
目前已有的MVC模式研究較多關注模型與視圖之間的分隔,而對于控制器的關注較少。在圖1所示的在線商城系統(tǒng)的描述中一共有4個Servlet,分別表示注冊、登錄、查詢商品、添加商品控制器。但是這樣做有很多限制:①一個servlet一般只能負責一個單一的業(yè)務邏輯,因為所有的業(yè)務邏輯通常情況下都集中在doPost這樣一個方法當中,隨著業(yè)務的增加,servlet數(shù)量會急劇增加;②系統(tǒng)每添加一個servlet就要在web.xml里面寫一個servlet配置,使得web.xml的配置文件非常的繁重;③由于每個Jsp頁面都對應不同的serlvet,使得在Jsp視圖中容易配置出錯,頁面不易于維護。
3 輕量級的MVC控制器框架設計
3.1 Struts2簡介與不足
控制器是MVC模式的樞紐,控制器的撰寫容易程度以及使用便捷性直接影響編程人員的效率以及程序的性能。如圖1所示的案例中,一個瀏覽器的請求對應一個Servlet控制器的方式存在如2.2小節(jié)所述的幾點不足。
在J2EE體系中,Struts2[6]的出現(xiàn)為使用MVC模式提供了便利,Struts2是一種基于MVC的Web應用框架。Struts2有三部分組成:核心控制器(FilterDispatcher)、業(yè)務控制器和業(yè)務邏輯組件。其中核心控制器FilterDispatcher由Struts2提供,而業(yè)務邏輯控制器和業(yè)務邏輯組件由用戶自己實現(xiàn)。業(yè)務控制器組件實現(xiàn)Action類的實例,而業(yè)務邏輯組件一般由javaBean或者EJB實現(xiàn)。Struts2的運行過程是:核心控制器FilterDispatcher會過濾所有的請求,如果請求以 action結尾,該請求會轉入框架處理。當框架獲取action請求后,根據(jù)action的前半部分決定調用哪個業(yè)務邏輯組件。最后根據(jù)業(yè)務邏輯組件的處理信息決定轉發(fā)到哪個視圖。Struts2實現(xiàn)MVC模式,結構清晰,使開發(fā)者只關注業(yè)務邏輯的實現(xiàn)。此外Struts有豐富的標記庫(Taglib),如能靈活動用,能大大提高開發(fā)效率。但是,Struts的使用仍是一個復雜的過程,首先是對Struts-config.xml的管理;其次是轉到視圖時,需要配置forward,如果有十個展示層的Jsp,需要配置十次struts,而且還不包括有時候目錄/文件變更,需要重新修改forward;再就是每次修改配置之后,要求重新部署整個項目,而tomcate服務器還必須重新啟動。雖然Taglib內容豐富,但是要想靈活運用它卻需要一個長期的過程,因此對于初學者而言直接采用Struts有較高難度。
3.2 1+N模式控制器框架設計
Struts2對于初學者而言使用過程比較復雜,但是Struts2提供了一個很好的策略,即將控制器區(qū)分為核心控制器和業(yè)務控制器,這是一種值得借鑒的設計模式。
根據(jù)GOF23設計模式中的門面模式(Fa?ade pattern)[7]定義:為子系統(tǒng)中的一組接口提供一個一致的界面。Fa?ade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。在一定程度上Stuts2的核心控制器FilterDispatcher即為采用該設計模式的理念,這種理念使得外部調用者并不知道底層的實現(xiàn)細節(jié),由Fa?ade來進行轉發(fā)。如圖2所示。
基于以上分析,本文基于門面模式和簡單工廠模式設計了一種“1+N模式”輕量級控制器框架,“1+N”中的“1”表示核心控制器,核心控制器即為門面模式中的Fa?ade,其作用主要是響應來自客戶端的請求,并根據(jù)請求轉向到具體的業(yè)務控制器,從而完成該次請求的過程,最后通過業(yè)務控制器返回的JSP 視圖地址,完成重定向。而各個業(yè)務控制器使用JavaBean技術來實現(xiàn),其主要作用是管理請求流程處理過程,實現(xiàn)模型和視圖二者關系的映射,實際的業(yè)務處理過程還是由模型實現(xiàn)。圖3中的“1+N模式控制器”即表示了以上的核心思想。
圖3中的CoreServlet即為核心控制器,BusinessServletImp1即為業(yè)務控制器,在每次請求過程中都是由CoreServlet響應來自JspClient的請求,并根據(jù)請求的參數(shù)轉換為響應的業(yè)務控制器來進行處理。以上的處理方式借鑒了Fa?ade設計模式,但是又不完全一樣。在Fa?ade模式中客戶端不需要知道到底需要調用什么樣的內部模塊,但是在本框架中,客戶端需要通過參數(shù)告知核心控制器其業(yè)務控制器的類型和名字。
如圖3所示,本文設計的“1+N”模式控制器在實現(xiàn)調整的過程中還采用了簡單工廠模式[7]實現(xiàn),從設計模式的類型上,簡單工廠模式是屬于創(chuàng)建型模式,又稱作靜態(tài)工廠方法(Static Factory Method)模式,簡單工廠模式的核心思路是由一個工廠對象決定創(chuàng)建出哪一種產品類的實例。如圖4可以看出,“1+N”模式控制器涵蓋了三種類:一是工廠類,即BusinessServletFactory,二是產品接口IBusinessServlet,三是具體的產品,即BusinessServletImp。其中,工廠類BusinessServletFactory負責整個創(chuàng)建產品的邏輯判斷,為了使工廠類能夠知道需要哪一種產品,需要在創(chuàng)建產品時傳遞給工廠類一個參數(shù),而這個參數(shù)可以從客戶端的請求中獲取,從而確定想要創(chuàng)建哪種產品。通過簡單工廠模式的使用,避免了在核心控制器中不斷采用邏輯判斷的方式來確定所需要的業(yè)務控制器的編程方式。
3.3 1+N模式控制器各類核心代碼示例
⑴ JspClient請求代碼設計
根據(jù)3.2小節(jié)的分析,在JSP頁面中,只需要指定核心控制器路徑以及業(yè)務控制器名稱即可,比如一個登陸的Jsp中form的action可以編寫action ="CoreServlet ? BusinessServlet= LoginBusinessServletImp。上面的源碼中,指定了要處理的控制器為CoreServlet,并且通過參數(shù)指定了業(yè)務控制器的名稱為LoginBusinessServletImp。
⑵ CoreServlet處理流程核心代碼設計
根據(jù)3.2小節(jié)的分析,CoreServlet的工作主要是響應Jsp的請求,然后通過工廠類獲取相應的業(yè)務控制器對象,最后通過業(yè)務控制器返回的JSP視圖地址,完成重定向。關鍵代碼示例如下。
通過上述分析可以發(fā)現(xiàn):1+N”模式控制器是一種輕量級框架,其方法原理清晰,使用簡單,避免了Struts中復雜的配置文件;由于采用了門面模式的核心思想,降低客戶端請求配置的難度,只需要指定核心控制器的路徑及輔助業(yè)務控制器名字即可,同時也避免了需要在系統(tǒng)的web.xml中配置大量servlet的麻煩;由于采用了簡單工廠模式,使得業(yè)務控制器的生成不需要復雜的流程判斷,而且模型和視圖的修改不會影響到核心控制器的修改,使得核心控制器具有較好的可維護性。
4 結束語
MVC模式已經被廣泛應用在各種Web系統(tǒng)開發(fā)中,本文對J2EE中MVC模式的控制器的實現(xiàn)做了進一步研究,基于門面模式和簡單工廠模式設計了“1+N”模式控制器框架,即通過核心控制器和業(yè)務控制器聯(lián)合實現(xiàn)控制器的功能, 核心控制器負責統(tǒng)一響應客戶端的請求,并通過工廠類得到業(yè)務控制器對象,然后將客戶端請求轉換到業(yè)務控制器進行處理。該框架簡化了web.xml配置,降低了客戶端請求配置的難度,框架采用簡單工廠模式,具有較好的可擴展性和可維護性。目前該框架已應用在羅定市特色農產品網(wǎng)絡信息服務平臺中,取得了較好效果。
參考文獻:
[1] 王文新.基于模型-視圖-控制器的Web應用程序框架設計[J].信息與電子工程,2009.7(4):358-360
[2] 鄭建華,陳爾曉.MVCA模式設計及應用研究[J].電腦知識與技術,2012.32(1):199-200,225
[3] E. Hanyuda.MVC dance: Connecting software development andcorporeality from agile process and pattern language perspectives[A].Proceedings of Second International Conference on Creating,Connecting and Collaborating through Computing[C].Kyoto University, Kyoto, Japan,2004:174-180
[4] 龔薇華,王晨光,俞歡軍.基于MVC模式和.NET的公司內部管理信息系統(tǒng)設計[J].計算機工程與設計,2007.28(9):2142-2144
[5] 張麗虹.基于J2EE架構的經濟普查系統(tǒng)設計與實現(xiàn)[J].計算機時代,2013.2:28-31
[6] 李倩倩.基于Struts+Spring+Hibernate框架的編目管理系統(tǒng)的研究與實現(xiàn)[D].中國地質大學(北京)碩士論文,2013.
[7] 劉德山,金百東.Java設計模式深入研究[M].人民郵電出版社,2014.