摘 要:文章主要介紹了MVC設(shè)計(jì)模式的思想、處理過程和優(yōu)缺點(diǎn),并著重介紹了目前比較廣泛使用的實(shí)現(xiàn)MVC設(shè)計(jì)模式的開發(fā)框架Struts2框架,對它的實(shí)現(xiàn)機(jī)制以及工作流程作了詳細(xì)的分析。
關(guān)鍵詞:MVC;設(shè)計(jì)模式;Struts2;web開發(fā)
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1006-8937(2014)9-0055-02
MVC是Model(模型)-View(視圖)-Controller(控制器)的簡稱。在MVC出現(xiàn)之前,在一個Web項(xiàng)目中,典型的模式是將模型層和控制層結(jié)合到視圖層當(dāng)中,使得各層之間的耦合性非常高,這樣導(dǎo)致后續(xù)的維護(hù)和擴(kuò)展工作極其困難,而利用MVC模式能夠很好的解決這些問題,它將一個Web項(xiàng)目分成3個基本的部分,以最少的耦合工作,是目前應(yīng)用最廣泛的軟件設(shè)計(jì)模式之一。運(yùn)用MVC模式能大大減少開發(fā)時間,讓開發(fā)人員將精力專注在主要的業(yè)務(wù)邏輯上,而界面程序員則主要專注于表現(xiàn)形式上,很大程度的提高開發(fā)效率,降低開發(fā)成本,提高Web應(yīng)用的擴(kuò)展性及維護(hù)性。
1 MVC設(shè)計(jì)模式
隨著互聯(lián)網(wǎng)的流行和發(fā)展,近年來,Web在企業(yè)信息化的過程中日益扮演著越來越重要的角色,很多公司將B/S體系結(jié)構(gòu)作為它們的首選的開發(fā)方式,與C/S結(jié)構(gòu)不同,它將數(shù)據(jù)和應(yīng)用程序放在了Server(服務(wù)器)上,Client(客戶端)則運(yùn)用Web瀏覽器,如果邏輯業(yè)務(wù)發(fā)生改變,只需要對服務(wù)器進(jìn)行修改,而不需要對客戶端進(jìn)行更改,通過這樣的分層,使得Web應(yīng)用的安全、性能和擴(kuò)展性得到了大大的提高。
但是現(xiàn)流行的Web項(xiàng)目開發(fā)中還存在問題,如缺乏優(yōu)秀的開發(fā)框架,程序易讀性差,開發(fā)效率低、代價高等。針對這種情況,為了解決目前軟件開發(fā)中遇到的這些問題,亟需一種新的開發(fā)模式,因此MVC模式應(yīng)運(yùn)而生了。
1.1 MVC思想
MVC是一個設(shè)計(jì)模式,它將一個Web項(xiàng)目的輸入、輸出和處理分開。在交互式系統(tǒng)中,MVC設(shè)計(jì)模式將它分解成3個主要的部分,即模型(Model)、視圖(View)和控制器(Controller)。它們分工明確,各自處理自己的工作,各部分的功能如下:
①模型部分:模型是Web應(yīng)用的核心。它代表業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯,可以為多個視圖提供數(shù)據(jù)。由于同一個Model可以被多個View重用,所以增加了Model的可重用性。
②控制器部分:控制器主要負(fù)責(zé)所有的用戶請求參數(shù),確定應(yīng)用程序的行為,決定應(yīng)該調(diào)用哪個模型來處理。它是視圖和模型之間交互的工具。
③視圖部分:視圖是用戶和系統(tǒng)之間交流的媒介,它主要從模型中取出用戶需要的數(shù)據(jù),同時還接受用戶的輸入,但自身不做跟業(yè)務(wù)邏輯有關(guān)的事物。視圖通過模型查詢模型的狀態(tài),但不能對模型進(jìn)行修改。視圖可以接受來自模型發(fā)出的數(shù)據(jù)更新命令,根據(jù)命令修改相應(yīng)的視圖。
1.2 MVC處理過程
第一步:用戶在視圖上發(fā)出命令,控制器接收用戶的命令,同時確定調(diào)用哪個模型來處理用戶命令;第二步:模型根據(jù)用戶的命令并執(zhí)行對應(yīng)的邏輯業(yè)務(wù)操作,同時返回操作結(jié)果;第三步:控制器調(diào)用對應(yīng)的視圖并對返回的操作結(jié)果做適當(dāng)?shù)奶幚?,然后在視圖上顯示。
1.3 MVC設(shè)計(jì)模式的優(yōu)缺點(diǎn)
1.3.1 MVC的優(yōu)點(diǎn)
①耦合性低。在目前用戶需求快速變化的情況下,將View和業(yè)務(wù)層分離,如果系統(tǒng)的需求發(fā)生了改變,不需要改動業(yè)務(wù)層和視圖層,而只需要改變模型層,大大降低了代碼的維護(hù)工作。
②重用性高。不同的用戶視圖可以共享相同的服務(wù)器端代碼,多個視圖共享相同的模型,很大程度的增加了代碼的可重用性。
③可移植性。模型不依賴于視圖,可以把模型移植到新的平臺。而只需要在移植后的平臺上對Control(控制器)和View(視圖)作簡單的修改,無需改變模型。
1.3.2 MVC的缺點(diǎn)
①因?yàn)镸VC將整個應(yīng)用程序分層,實(shí)現(xiàn)機(jī)制復(fù)雜,運(yùn)用它需要程序員專門去學(xué)習(xí)它的知識。所以業(yè)務(wù)簡單的應(yīng)用程序會讓結(jié)構(gòu)變得復(fù)雜,還會產(chǎn)生不必要的數(shù)據(jù)更新,使得系效率低,所以小型Web應(yīng)用程序不適合MVC模式。
②View與Control之間相互依賴。視圖和控制器雖然是分開的,但是雙方卻又是緊密聯(lián)系在一起的,離開了控制器,視圖的功能受到限制,所以他們之間依賴性大。所以它們很難單獨(dú)重用。
③View對Model訪問效率低。由于模型操作的不同接口,視圖一般情況需要調(diào)用多次才能獲得所要的數(shù)據(jù),這樣對于沒有變化的數(shù)據(jù)造成多余的訪問,降低了系統(tǒng)的性能。
④目前,有些比較流行工具不能很好的支持MVC模式。如果要使用這些工具來適應(yīng)MVC模式,那需要付出很大的代價。
2 MVC設(shè)計(jì)模式的實(shí)現(xiàn)—Struts2
2.1 Struts2實(shí)現(xiàn)MVC的機(jī)制
Struts是一個開源項(xiàng)目,是典型的基于MVC的Web應(yīng)用框架,在struts中,Model由javabean或EJB組成,控制器由FilterDispatcher和Action來完成,視圖由JSP文件組成。各部分功能如下:
①視圖。負(fù)責(zé)系統(tǒng)的視圖實(shí)現(xiàn),由jsp組成。這些jsp文件只實(shí)現(xiàn)頁面的顯示,沒有涉及到具體的業(yè)務(wù)邏輯。
②模型。在一些大型的Web應(yīng)用中,業(yè)務(wù)邏輯的實(shí)現(xiàn)一般讓EJB和JavaBean來完成。Struts為模型層提供了Action和ActionForm組件。
③控制器。控制器一般由Action類和FilterDispatcher類實(shí)現(xiàn)。FilterDispatcher類在MVC設(shè)計(jì)模式中主要起到中央控制器的作用,它接受來自用戶的HTTP請求的信息,根據(jù)struts.xml,把信息發(fā)送到相應(yīng)的Action,如果相應(yīng)的操作對象找不到,那么FilterDispatcher負(fù)責(zé)創(chuàng)建相應(yīng)的對象。
④Struts的配置文件struts.xml。Struts.xml是struts的默認(rèn)配置文件。主要實(shí)現(xiàn)View與model之間的對應(yīng)關(guān)系。
2.2 Struts2的工作流程
采用Struts框架的應(yīng)用程序,在服務(wù)啟動之前,會加載并初始化FilterDispatcher。它接收到一個請求時,將執(zhí)行以下步驟:
①第一步是搜索和用戶請求相對應(yīng)的Action,如果沒有搜索到,系統(tǒng)將先創(chuàng)建這個實(shí)例。
②第二步是用第一步中對應(yīng)的方法來調(diào)用模型中的有關(guān)組件來處理業(yè)務(wù)邏輯,并返回一個字符串,表示下一步負(fù)責(zé)處理請求的模板組件的邏輯名稱。
③第三步是FilterDispatcher從Struts配置文件中獲取和Action的對應(yīng)方法返回邏輯名字對應(yīng)的實(shí)際URL,然后再把請求轉(zhuǎn)發(fā)給目標(biāo)組件。如果這個目標(biāo)組件是jsp文件,這個jsp文件就會把包含了響應(yīng)結(jié)果的視圖展現(xiàn)給用戶。
3 結(jié) 語
一個成功的應(yīng)用軟件不僅在良好的技術(shù)支持,還需要有成功的模式和框架予以指導(dǎo)。MVC設(shè)計(jì)模式作為一種框架模式在web開發(fā)應(yīng)用當(dāng)具有重要的意義,它具有獨(dú)特的優(yōu)勢,通過將View(表示層)、Service(業(yè)務(wù)層)和Action(控制層)分離,降低了每個層間的耦合度,降低了各層之間的依賴,提高了系統(tǒng)的可維護(hù)性和重用性。
參考文獻(xiàn):
[1] 吳剛珂,倪紅美.基于瀏覽器/服務(wù)器結(jié)構(gòu)的LIS開發(fā)與應(yīng)用[J].現(xiàn)代檢驗(yàn)醫(yī)學(xué)雜志,2012,(6).
[2] 韓明.基于Struts-Spring-Hibernate的Java應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2006.
[3] 孫衛(wèi)琴.精通Struts:基于MVC的Java Web設(shè)計(jì)與開發(fā)[M].北京:電子工業(yè)出版社,2004.
[4] 涂婷婷,段凡丁.MVC設(shè)計(jì)模式在B/S開發(fā)中的研究與應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2007,(5).