国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Servlet的MVC控制器框架設(shè)計(jì)

2015-05-30 10:05:47鄭建華朱蓉邱振國(guó)
計(jì)算機(jī)時(shí)代 2015年4期
關(guān)鍵詞:控制器

鄭建華 朱蓉 邱振國(guó)

摘 要: 控制器在MVC模式中起著重要作用。分析了J2EE中MVC模式的實(shí)現(xiàn)方式,指出了經(jīng)典的基于Servlet控制器的不足,分析了Struts2中控制器的核心原理。提出了一種基于門(mén)面模式和簡(jiǎn)單工廠模式的輕量級(jí)控制器框架,將其命名為“1+N”模式控制器。該控制器主要包括核心控制器和業(yè)務(wù)控制器,由核心控制器統(tǒng)一響應(yīng)客戶前端的請(qǐng)求,并將請(qǐng)求轉(zhuǎn)換到相應(yīng)的業(yè)務(wù)控制器進(jìn)行處理。給出了該框架中核心類(lèi)的源代碼。該框架易于使用且具有較好的可擴(kuò)展性和可維護(hù)性。

關(guān)鍵詞: MVC; 控制器; 門(mén)面模式; 簡(jiǎn)單工廠模式; 核心控制器

中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言

當(dāng)前信息化水平已成為衡量一個(gè)國(guó)家現(xiàn)代化水平和綜合國(guó)力的重要標(biāo)志。信息化建設(shè)離不開(kāi)系統(tǒng)的建設(shè),傳統(tǒng)的Web應(yīng)用系統(tǒng)會(huì)在表現(xiàn)層包含管理用戶交互的代碼,這樣對(duì)于整個(gè)應(yīng)用系統(tǒng)來(lái)說(shuō),它的業(yè)務(wù)邏輯、控制邏輯和運(yùn)行狀態(tài)等都很難被重用。MVC模式解耦了業(yè)務(wù)邏輯、控制邏輯,提高了代碼重用,又能使系統(tǒng)易于維護(hù)和修改[1]。

然而目前的研究更多是關(guān)注模型層和業(yè)務(wù)邏輯層,對(duì)MVC中控制器的研究較少。在目前被廣泛使用的基于J2EE的Web開(kāi)發(fā)方式中,控制器主要是依靠Serlvet實(shí)現(xiàn),而經(jīng)典的Serlvet控制器實(shí)現(xiàn)方式存在諸如Serlvet類(lèi)過(guò)多,web.xml配置復(fù)雜等缺點(diǎn)。雖然Struts2.0提供了一種控制器實(shí)現(xiàn)方式,但是Struts2.0的復(fù)雜性對(duì)于初學(xué)者有較高難度。本研究基于門(mén)面模式和簡(jiǎn)單工廠模式提出一種輕量級(jí)的“1+N”控制器框架,并給出了核心類(lèi)的關(guān)鍵實(shí)現(xiàn)代碼。

1 MVC模式簡(jiǎn)介

模型(Model)-視圖(View)-控制器(Controller)(MVC)[2]是Xerox PARC在八十年代為編程語(yǔ)言Smalltalk-80發(fā)明的一種軟件設(shè)計(jì)模式,至今已被廣泛使用[3]。MVC把交互系統(tǒng)的組成分解成模型、視圖、控制器三種組件。

模型組件封裝了應(yīng)用程序的核心數(shù)據(jù),以及這些數(shù)據(jù)的訪問(wèn)和修改的業(yè)務(wù)規(guī)則,它表達(dá)了程序所使用的數(shù)據(jù)和生成數(shù)據(jù)的運(yùn)行狀態(tài),它獨(dú)立于具體的界面表達(dá)和I/O操作。

視圖組件把模型數(shù)據(jù)及邏輯關(guān)系和狀態(tài)的信息以特定形式展示給用戶,主要負(fù)責(zé)如何表示數(shù)據(jù),對(duì)于相同的信息可以有多個(gè)不同的顯示形式,并當(dāng)模型改變時(shí),維護(hù)表示的一致性。視圖也負(fù)責(zé)把用戶動(dòng)作傳遞給控制器。

控制組件負(fù)責(zé)模型和視圖之間的交互,控制對(duì)用戶輸入的響應(yīng)方式和流程,確保視圖與模型間的對(duì)應(yīng)聯(lián)系。它接受用戶的輸入,將輸入反饋給模型,進(jìn)而實(shí)現(xiàn)對(duì)模型的計(jì)算控制,同時(shí)又將模型的改變及時(shí)反映在視圖上,使模型和視圖協(xié)調(diào)。

模型、視圖與控制器的分離,使得一個(gè)模型可以具有多個(gè)顯示視圖,模型數(shù)據(jù)發(fā)生變化,控制器都會(huì)將變化通知所有的視圖,導(dǎo)致顯示的更新,實(shí)現(xiàn)了數(shù)據(jù)層與表示層的分離,這使得程序開(kāi)發(fā)更加靈活,并且可以減少重復(fù)性代碼,實(shí)現(xiàn)代碼重用,易于維護(hù)和修改。

2 J2EE中MVC模式實(shí)現(xiàn)及不足

2.1 基于JSP+Sevlet的MVC模式實(shí)現(xiàn)

MVC模式目前被廣泛應(yīng)用于Web系統(tǒng)開(kāi)發(fā)。比如有文獻(xiàn)研究了.Net平臺(tái)下的基于MVC模式的Web應(yīng)用開(kāi)發(fā)[4],而在J2EE體系中,其應(yīng)用也越來(lái)越廣泛[5]。

J2EE中經(jīng)典MVC模式采用的是基于Jsp+Servlet+JavaBean的實(shí)現(xiàn),由Jsp頁(yè)面實(shí)現(xiàn)視圖(View),負(fù)責(zé)前臺(tái)的展示;JavaBean實(shí)現(xiàn)模型(model),處理業(yè)務(wù)邏輯;由Servlet實(shí)現(xiàn)控制器(Controller),負(fù)責(zé)業(yè)務(wù)層和視圖層的協(xié)調(diào)控制。

圖1展示了在線商城系統(tǒng)的基于Jsp+Servlet+JavaBean的J2EE中MVC模式的實(shí)現(xiàn)過(guò)程,整個(gè)框架的作用過(guò)程為:①Jsp頁(yè)面向Servlet發(fā)送請(qǐng)求;②Servlet接收到Jsp請(qǐng)求后向JavaBean模型發(fā)送業(yè)務(wù)請(qǐng)求;③然后JavaBean進(jìn)行相關(guān)業(yè)務(wù)處理,將返回處理結(jié)果到Servlet;④最后由Servlet根據(jù)結(jié)果顯示要求,返回到不同的展示Jsp頁(yè)面。比如圖1中的LoginServlet可能將結(jié)果返回到Login.jsp,Succ.jsp,Error.jsp,即一個(gè)控制器可能與多個(gè)視圖關(guān)聯(lián),而視圖Jsp的展示結(jié)果是與模型JavaBean保持協(xié)同一致的。

通過(guò)以上方式較好地實(shí)現(xiàn)了三個(gè)層次功能的解耦,易于實(shí)現(xiàn)代碼的維護(hù)和修改。

2.2 經(jīng)典Servlet的控制器實(shí)現(xiàn)與不足

按照MVC模式的劃分,在J2EE中Controller(控制器)由Servlet完成,使MVC模式中的三部分之間耦合性降到最低,最大限度地將Web應(yīng)用系統(tǒng)中控制與業(yè)務(wù)邏輯分開(kāi)。Servlet作為整個(gè)系統(tǒng)架構(gòu)的交通樞紐,起著調(diào)度作用,其實(shí)JSP在執(zhí)行前先被編譯成字節(jié)碼,最終以Servlet執(zhí)行碼形式存在。由此可知Servlet在整個(gè)J2EE體系結(jié)構(gòu)中起主要作用。

目前已有的MVC模式研究較多關(guān)注模型與視圖之間的分隔,而對(duì)于控制器的關(guān)注較少。在圖1所示的在線商城系統(tǒng)的描述中一共有4個(gè)Servlet,分別表示注冊(cè)、登錄、查詢(xún)商品、添加商品控制器。但是這樣做有很多限制:①一個(gè)servlet一般只能負(fù)責(zé)一個(gè)單一的業(yè)務(wù)邏輯,因?yàn)樗械臉I(yè)務(wù)邏輯通常情況下都集中在doPost這樣一個(gè)方法當(dāng)中,隨著業(yè)務(wù)的增加,servlet數(shù)量會(huì)急劇增加;②系統(tǒng)每添加一個(gè)servlet就要在web.xml里面寫(xiě)一個(gè)servlet配置,使得web.xml的配置文件非常的繁重;③由于每個(gè)Jsp頁(yè)面都對(duì)應(yīng)不同的serlvet,使得在Jsp視圖中容易配置出錯(cuò),頁(yè)面不易于維護(hù)。

3 輕量級(jí)的MVC控制器框架設(shè)計(jì)

3.1 Struts2簡(jiǎn)介與不足

控制器是MVC模式的樞紐,控制器的撰寫(xiě)容易程度以及使用便捷性直接影響編程人員的效率以及程序的性能。如圖1所示的案例中,一個(gè)瀏覽器的請(qǐng)求對(duì)應(yīng)一個(gè)Servlet控制器的方式存在如2.2小節(jié)所述的幾點(diǎn)不足。

在J2EE體系中,Struts2[6]的出現(xiàn)為使用MVC模式提供了便利,Struts2是一種基于MVC的Web應(yīng)用框架。Struts2有三部分組成:核心控制器(FilterDispatcher)、業(yè)務(wù)控制器和業(yè)務(wù)邏輯組件。其中核心控制器FilterDispatcher由Struts2提供,而業(yè)務(wù)邏輯控制器和業(yè)務(wù)邏輯組件由用戶自己實(shí)現(xiàn)。業(yè)務(wù)控制器組件實(shí)現(xiàn)Action類(lèi)的實(shí)例,而業(yè)務(wù)邏輯組件一般由javaBean或者EJB實(shí)現(xiàn)。Struts2的運(yùn)行過(guò)程是:核心控制器FilterDispatcher會(huì)過(guò)濾所有的請(qǐng)求,如果請(qǐng)求以 action結(jié)尾,該請(qǐng)求會(huì)轉(zhuǎn)入框架處理。當(dāng)框架獲取action請(qǐng)求后,根據(jù)action的前半部分決定調(diào)用哪個(gè)業(yè)務(wù)邏輯組件。最后根據(jù)業(yè)務(wù)邏輯組件的處理信息決定轉(zhuǎn)發(fā)到哪個(gè)視圖。Struts2實(shí)現(xiàn)MVC模式,結(jié)構(gòu)清晰,使開(kāi)發(fā)者只關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn)。此外Struts有豐富的標(biāo)記庫(kù)(Taglib),如能靈活動(dòng)用,能大大提高開(kāi)發(fā)效率。但是,Struts的使用仍是一個(gè)復(fù)雜的過(guò)程,首先是對(duì)Struts-config.xml的管理;其次是轉(zhuǎn)到視圖時(shí),需要配置forward,如果有十個(gè)展示層的Jsp,需要配置十次struts,而且還不包括有時(shí)候目錄/文件變更,需要重新修改forward;再就是每次修改配置之后,要求重新部署整個(gè)項(xiàng)目,而tomcate服務(wù)器還必須重新啟動(dòng)。雖然Taglib內(nèi)容豐富,但是要想靈活運(yùn)用它卻需要一個(gè)長(zhǎng)期的過(guò)程,因此對(duì)于初學(xué)者而言直接采用Struts有較高難度。

3.2 1+N模式控制器框架設(shè)計(jì)

Struts2對(duì)于初學(xué)者而言使用過(guò)程比較復(fù)雜,但是Struts2提供了一個(gè)很好的策略,即將控制器區(qū)分為核心控制器和業(yè)務(wù)控制器,這是一種值得借鑒的設(shè)計(jì)模式。

根據(jù)GOF23設(shè)計(jì)模式中的門(mén)面模式(Fa?ade pattern)[7]定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面。Fa?ade模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用。在一定程度上Stuts2的核心控制器FilterDispatcher即為采用該設(shè)計(jì)模式的理念,這種理念使得外部調(diào)用者并不知道底層的實(shí)現(xiàn)細(xì)節(jié),由Fa?ade來(lái)進(jìn)行轉(zhuǎn)發(fā)。如圖2所示。

基于以上分析,本文基于門(mén)面模式和簡(jiǎn)單工廠模式設(shè)計(jì)了一種“1+N模式”輕量級(jí)控制器框架,“1+N”中的“1”表示核心控制器,核心控制器即為門(mén)面模式中的Fa?ade,其作用主要是響應(yīng)來(lái)自客戶端的請(qǐng)求,并根據(jù)請(qǐng)求轉(zhuǎn)向到具體的業(yè)務(wù)控制器,從而完成該次請(qǐng)求的過(guò)程,最后通過(guò)業(yè)務(wù)控制器返回的JSP 視圖地址,完成重定向。而各個(gè)業(yè)務(wù)控制器使用JavaBean技術(shù)來(lái)實(shí)現(xiàn),其主要作用是管理請(qǐng)求流程處理過(guò)程,實(shí)現(xiàn)模型和視圖二者關(guān)系的映射,實(shí)際的業(yè)務(wù)處理過(guò)程還是由模型實(shí)現(xiàn)。圖3中的“1+N模式控制器”即表示了以上的核心思想。

圖3中的CoreServlet即為核心控制器,BusinessServletImp1即為業(yè)務(wù)控制器,在每次請(qǐng)求過(guò)程中都是由CoreServlet響應(yīng)來(lái)自JspClient的請(qǐng)求,并根據(jù)請(qǐng)求的參數(shù)轉(zhuǎn)換為響應(yīng)的業(yè)務(wù)控制器來(lái)進(jìn)行處理。以上的處理方式借鑒了Fa?ade設(shè)計(jì)模式,但是又不完全一樣。在Fa?ade模式中客戶端不需要知道到底需要調(diào)用什么樣的內(nèi)部模塊,但是在本框架中,客戶端需要通過(guò)參數(shù)告知核心控制器其業(yè)務(wù)控制器的類(lèi)型和名字。

如圖3所示,本文設(shè)計(jì)的“1+N”模式控制器在實(shí)現(xiàn)調(diào)整的過(guò)程中還采用了簡(jiǎn)單工廠模式[7]實(shí)現(xiàn),從設(shè)計(jì)模式的類(lèi)型上,簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式,又稱(chēng)作靜態(tài)工廠方法(Static Factory Method)模式,簡(jiǎn)單工廠模式的核心思路是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例。如圖4可以看出,“1+N”模式控制器涵蓋了三種類(lèi):一是工廠類(lèi),即BusinessServletFactory,二是產(chǎn)品接口IBusinessServlet,三是具體的產(chǎn)品,即BusinessServletImp。其中,工廠類(lèi)BusinessServletFactory負(fù)責(zé)整個(gè)創(chuàng)建產(chǎn)品的邏輯判斷,為了使工廠類(lèi)能夠知道需要哪一種產(chǎn)品,需要在創(chuàng)建產(chǎn)品時(shí)傳遞給工廠類(lèi)一個(gè)參數(shù),而這個(gè)參數(shù)可以從客戶端的請(qǐng)求中獲取,從而確定想要?jiǎng)?chuàng)建哪種產(chǎn)品。通過(guò)簡(jiǎn)單工廠模式的使用,避免了在核心控制器中不斷采用邏輯判斷的方式來(lái)確定所需要的業(yè)務(wù)控制器的編程方式。

3.3 1+N模式控制器各類(lèi)核心代碼示例

⑴ JspClient請(qǐng)求代碼設(shè)計(jì)

根據(jù)3.2小節(jié)的分析,在JSP頁(yè)面中,只需要指定核心控制器路徑以及業(yè)務(wù)控制器名稱(chēng)即可,比如一個(gè)登陸的Jsp中form的action可以編寫(xiě)action ="CoreServlet ? BusinessServlet= LoginBusinessServletImp。上面的源碼中,指定了要處理的控制器為CoreServlet,并且通過(guò)參數(shù)指定了業(yè)務(wù)控制器的名稱(chēng)為L(zhǎng)oginBusinessServletImp。

⑵ CoreServlet處理流程核心代碼設(shè)計(jì)

根據(jù)3.2小節(jié)的分析,CoreServlet的工作主要是響應(yīng)Jsp的請(qǐng)求,然后通過(guò)工廠類(lèi)獲取相應(yīng)的業(yè)務(wù)控制器對(duì)象,最后通過(guò)業(yè)務(wù)控制器返回的JSP視圖地址,完成重定向。關(guān)鍵代碼示例如下。

通過(guò)上述分析可以發(fā)現(xiàn):1+N”模式控制器是一種輕量級(jí)框架,其方法原理清晰,使用簡(jiǎn)單,避免了Struts中復(fù)雜的配置文件;由于采用了門(mén)面模式的核心思想,降低客戶端請(qǐng)求配置的難度,只需要指定核心控制器的路徑及輔助業(yè)務(wù)控制器名字即可,同時(shí)也避免了需要在系統(tǒng)的web.xml中配置大量servlet的麻煩;由于采用了簡(jiǎn)單工廠模式,使得業(yè)務(wù)控制器的生成不需要復(fù)雜的流程判斷,而且模型和視圖的修改不會(huì)影響到核心控制器的修改,使得核心控制器具有較好的可維護(hù)性。

4 結(jié)束語(yǔ)

MVC模式已經(jīng)被廣泛應(yīng)用在各種Web系統(tǒng)開(kāi)發(fā)中,本文對(duì)J2EE中MVC模式的控制器的實(shí)現(xiàn)做了進(jìn)一步研究,基于門(mén)面模式和簡(jiǎn)單工廠模式設(shè)計(jì)了“1+N”模式控制器框架,即通過(guò)核心控制器和業(yè)務(wù)控制器聯(lián)合實(shí)現(xiàn)控制器的功能, 核心控制器負(fù)責(zé)統(tǒng)一響應(yīng)客戶端的請(qǐng)求,并通過(guò)工廠類(lèi)得到業(yè)務(wù)控制器對(duì)象,然后將客戶端請(qǐng)求轉(zhuǎn)換到業(yè)務(wù)控制器進(jìn)行處理。該框架簡(jiǎn)化了web.xml配置,降低了客戶端請(qǐng)求配置的難度,框架采用簡(jiǎn)單工廠模式,具有較好的可擴(kuò)展性和可維護(hù)性。目前該框架已應(yīng)用在羅定市特色農(nóng)產(chǎn)品網(wǎng)絡(luò)信息服務(wù)平臺(tái)中,取得了較好效果。

參考文獻(xiàn):

[1] 王文新.基于模型-視圖-控制器的Web應(yīng)用程序框架設(shè)計(jì)[J].信息與電子工程,2009.7(4):358-360

[2] 鄭建華,陳爾曉.MVCA模式設(shè)計(jì)及應(yīng)用研究[J].電腦知識(shí)與技術(shù),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的公司內(nèi)部管理信息系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2007.28(9):2142-2144

[5] 張麗虹.基于J2EE架構(gòu)的經(jīng)濟(jì)普查系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)時(shí)代,2013.2:28-31

[6] 李倩倩.基于Struts+Spring+Hibernate框架的編目管理系統(tǒng)的研究與實(shí)現(xiàn)[D].中國(guó)地質(zhì)大學(xué)(北京)碩士論文,2013.

[7] 劉德山,金百東.Java設(shè)計(jì)模式深入研究[M].人民郵電出版社,2014.

猜你喜歡
控制器
工商業(yè)IC卡控制器改造為物聯(lián)網(wǎng)控制器實(shí)踐
基于DSP的復(fù)合跟蹤控制器的設(shè)計(jì)
模糊PID控制器設(shè)計(jì)及MATLAB仿真
MOXA RTU控制器ioPAC 5542系列
紅獅控制 PID控制器PXU系列
4V三輸出同步降壓型控制器
长泰县| 凭祥市| 太康县| 达州市| 澄江县| 邵东县| 正阳县| 白河县| 乐安县| 柯坪县| 都江堰市| 商河县| 富民县| 瓮安县| 饶阳县| 常宁市| 灵川县| 瑞丽市| 汨罗市| 昌邑市| 延吉市| 北京市| 沙洋县| 镶黄旗| 海晏县| 通江县| 涡阳县| 宜兰市| 麟游县| 崇义县| 雷山县| 延庆县| 吴江市| 新竹县| 白山市| 鄂托克旗| 准格尔旗| 昌乐县| 九江市| 定襄县| 天水市|