楊靜
摘要:MVC(Model-View-Controller)設(shè)計(jì)模式是現(xiàn)代軟件設(shè)計(jì)中一種非常重要的設(shè)計(jì)模式,也是WEB系統(tǒng)中常用的一種經(jīng)典模式,它實(shí)現(xiàn)了界面顯示與業(yè)務(wù)邏輯的分離。為了提高基于WEB系統(tǒng)中代碼的可重復(fù)性、可維護(hù)性、可移植性和系統(tǒng)性能的穩(wěn)定性,從數(shù)據(jù)庫訪問技術(shù)、XML技術(shù)和DAO設(shè)計(jì)模式的角度,提出一種MVC改進(jìn)模式,并闡述了基于此模式進(jìn)行開發(fā)的技術(shù)和原理。
關(guān)鍵詞:MVC;Model;設(shè)計(jì)模式;Java Web
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)28-6668-04
1 MVC設(shè)計(jì)模式
MVC是一種經(jīng)典的程序設(shè)計(jì)概念,此模式將應(yīng)用程序分成3個(gè)部分,分別是模型層(Model)、視圖層(View)、控制層(Controller),其關(guān)系如圖1所示:
1.1 模型層(Model)
模型層是應(yīng)用程序的核心部分,主要由JavaBean組件來充當(dāng),可以是一個(gè)實(shí)體對象或一種業(yè)務(wù)邏輯。負(fù)責(zé)表達(dá)和訪問數(shù)據(jù),執(zhí)行商業(yè)邏輯和操作,維護(hù)應(yīng)用程序狀態(tài)。在MVC 模型中,它控制視圖的表現(xiàn)結(jié)果。它采用面向?qū)ο蟮姆椒ǎ?將問題領(lǐng)域中的對象抽象為應(yīng)用程序?qū)ο?。在這些抽象的對象中封裝了對象的屬性和這些對象所隱含的邏輯。模型可以接收來自視圖的查詢并做出響應(yīng),在模型的數(shù)據(jù)變化的時(shí)候,它將通知視圖并提供后者訪問自身狀態(tài)的能力,視圖將根據(jù)模型的變化來更新自己,同時(shí)控制器也可以訪問模型的功能函數(shù)以完成相關(guān)的任務(wù)[1] 。
1.2 視圖層(View)
視圖層提供應(yīng)用程序與用戶之間的交互界面。它從模型中得到數(shù)據(jù)并按要求顯示出來,當(dāng)模型中的數(shù)據(jù)發(fā)生變化時(shí),視圖從模型中得到通知自動(dòng)更新視圖;它也可以將用戶輸入的信息傳送給控制器。在MVC模式中,這一層并不包含任何的業(yè)務(wù)邏輯,僅僅提供一種與用戶交互的視圖,在Web應(yīng)用中有JSP、HTML界面充當(dāng)。
1.3 控制層(Controller)
控制層用于對程序中的請求進(jìn)行控制,起到一種宏觀調(diào)控的作用,它可以通知容器選擇什么樣的視圖、什么樣的模型組件,在Web應(yīng)用中由Servlet充當(dāng)。
2 基于JSP的MVC設(shè)計(jì)模式
JSP(Java Server Pages)是由Sun公司倡導(dǎo)、許多公司參與建立的動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。它在HTML代碼中嵌入Java代碼片段(Scriptlet)和JSP標(biāo)簽,構(gòu)成JSP網(wǎng)頁。在接收到用戶請求時(shí),服務(wù)器會(huì)處理Java代碼片段,然后生成處理結(jié)果的HTML頁面返回給客戶端,客戶端的瀏覽器將呈現(xiàn)最終的頁面效果。JSP頁面負(fù)責(zé)數(shù)據(jù)顯示、業(yè)務(wù)邏輯、頁面控制等所有的工作,這給Web設(shè)計(jì)帶來了強(qiáng)耦合,維護(hù)困難,開發(fā)人員分工不明確,程序處理邏輯發(fā)雜等一系列問題。為了解決這種問題,Sun公司制定了兩種設(shè)計(jì)模式,模式一(Model1)和模式二(Model2)。Model1設(shè)計(jì)模式中,主要分兩層,視圖層和模型層。圖2稱之為模式一,雖然模式一實(shí)現(xiàn)了頁面顯示和業(yè)務(wù)邏輯的分離,但是在JSP頁面中不僅需要編寫顯示,而且很多業(yè)務(wù)邏輯、流程控制和調(diào)用JavaBean的程序代碼都出現(xiàn)在JSP頁面中,當(dāng)業(yè)務(wù)邏輯非常復(fù)雜時(shí),大量的內(nèi)嵌代碼會(huì)使得整個(gè)頁面程序變得異常復(fù)雜,使整個(gè)項(xiàng)目再維護(hù)的時(shí)候顯得非常困難。采用Model1模式開發(fā)小型項(xiàng)目非常的方便,每組頁面實(shí)現(xiàn)一個(gè)功能,當(dāng)需要對某個(gè)功能進(jìn)行修改時(shí),需要修改很多地方,這樣不利用功能的擴(kuò)展和更新。
為了解決模式一種的緊耦合、復(fù)用性差、維護(hù)成本高的缺點(diǎn),此時(shí)提出了Model2模式,如圖3所示。該圖表示的是一種把JSP與Servlets聯(lián)合使用來實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容服務(wù)的方法,即 MVC 模式。它可以很好地表達(dá)用戶與系統(tǒng)的交互模式以及整個(gè)系統(tǒng)的程序架構(gòu)模式。在該模式中,JSP充當(dāng)視圖層,主要負(fù)責(zé)視圖的顯示servlet充當(dāng)控制層,控制分發(fā)用戶的請求,根據(jù)用戶的請求,調(diào)用相應(yīng)的業(yè)務(wù)Bean,并將結(jié)果返回給適當(dāng)?shù)捻撁孢M(jìn)行顯示,JavaBean充當(dāng)模型層,主要負(fù)責(zé)業(yè)務(wù)邏輯的實(shí)現(xiàn),因此在構(gòu)建 Web 應(yīng)用,采用Model2模式具有顯著的優(yōu)勢。
3 改進(jìn)的MVC模式
采用Model2模式開發(fā)項(xiàng)目時(shí),在業(yè)務(wù)層中主要封裝了實(shí)體Bean和業(yè)務(wù)Bean,實(shí)體Bean主要用來封裝實(shí)體對象,而業(yè)務(wù)Bean主要是一些關(guān)于對數(shù)據(jù)庫的操作。此時(shí)在業(yè)務(wù)Bean就會(huì)涉及到數(shù)據(jù)庫的連接和關(guān)閉,當(dāng)在使用的過程中,如果頻繁的打開和關(guān)閉數(shù)據(jù)庫是非常耗時(shí)和浪費(fèi)系統(tǒng)資源的,此時(shí)我們可以在業(yè)務(wù)層中加入一個(gè)數(shù)據(jù)庫連接池,避免了數(shù)據(jù)庫頻繁的打開和關(guān)閉,提高了系統(tǒng)性能。當(dāng)一個(gè)項(xiàng)目的業(yè)務(wù)比較復(fù)雜時(shí),此時(shí)在Servlet中不僅有一些流程控制代碼和業(yè)務(wù)代碼,還有大量的數(shù)據(jù)處理代碼,此時(shí)應(yīng)該盡量減少在Servlet中的代碼,只讓Servlet做接收數(shù)據(jù),轉(zhuǎn)發(fā)數(shù)據(jù)功能,其它的事情放到外面去做,為了實(shí)現(xiàn)該功能,將在Servlet中對數(shù)據(jù)的一些處理操作代碼單獨(dú)封裝到Service層中,Servlet接收到用戶請求后,根據(jù)請求的目標(biāo),直接跳轉(zhuǎn)到對應(yīng)的Service中,在Service中負(fù)責(zé)對數(shù)據(jù)的處理和調(diào)用相應(yīng)的業(yè)務(wù)層。其實(shí)現(xiàn)流程圖如圖4所示。
4 基于MVC模式登陸模塊的實(shí)現(xiàn)
現(xiàn)在結(jié)合登陸模塊的開發(fā),介紹MVC的在Java Web中的具體實(shí)現(xiàn)步驟,從而加深對MVC設(shè)計(jì)的理解。用戶填寫登陸信息的界面和通過驗(yàn)證并返回信息的界面都為視圖(View);當(dāng)用戶填寫的信息通過Form表單提交后,此時(shí)需要根據(jù)action跳轉(zhuǎn)到指定的控制器(Controller),而此控制器主要是通過Servlet完成,Servlet需要在web.xml中進(jìn)行配置;通過控制器調(diào)用模型層(Model),連接數(shù)據(jù)庫,驗(yàn)證輸入信息是否在數(shù)據(jù)庫中存在。在此整個(gè)模塊所涉及到的程序清單如下表一各模塊的表述:
在數(shù)據(jù)庫連接時(shí),通常采用JDBC技術(shù),此技術(shù)作為一種數(shù)據(jù)庫訪問技術(shù),具有簡單易用的優(yōu)點(diǎn)。但使用這種模式進(jìn)行Web應(yīng)用程序開發(fā),存在很多問題:首先,每一次Web請求都要建立一次數(shù)據(jù)庫連接,而建立連接是一個(gè)費(fèi)時(shí)并且耗費(fèi)內(nèi)存資源;其次,對于每一次數(shù)據(jù)庫連接,使用完后都得斷開,否則,如果程序出現(xiàn)異常而未能關(guān)閉,將會(huì)導(dǎo)致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將不得不重啟數(shù)據(jù)庫。因此,這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會(huì)被毫無顧及的分配出去,如連接過多,也可能導(dǎo)致內(nèi)存泄漏,服務(wù)器崩潰。此時(shí)我們采用數(shù)據(jù)庫連接池進(jìn)行數(shù)據(jù)庫的打開和關(guān)閉。數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個(gè)“緩沖池”,預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。在配置數(shù)據(jù)庫連接池時(shí)需要修改Tomcat中的server.xml和項(xiàng)目中WEB-INF下的web.xml文件,再在程序中獲得已有連接。
在整個(gè)MVC設(shè)計(jì)中Model是其核心部分, 對于用戶登陸模塊,需要將輸入的數(shù)據(jù)或從數(shù)據(jù)庫中讀取的數(shù)據(jù)封裝到User類,從而各個(gè)模塊都能方便的使用該JavaBean對象了,而JavaBean在封裝的時(shí)候只需要書寫它的getXxx和setXxx方法就可以了,作為Model最重要的就是如何設(shè)計(jì)一個(gè)好的DAO模式來對數(shù)據(jù)庫進(jìn)行操作,為了以后能夠更好的進(jìn)行功能的擴(kuò)充,在DAO組件中先定義一個(gè)UserDAO接口,然后定義接口的UserDAOImpl實(shí)現(xiàn)類,在接口的實(shí)現(xiàn)類中定義的各種方法來實(shí)現(xiàn)對數(shù)據(jù)的操作,但不負(fù)責(zé)數(shù)據(jù)庫的連接和關(guān)閉操作,而要完成這一操作主要是通過代理來完成,并調(diào)用真實(shí)主題,通過一個(gè)DAOFactory工廠實(shí)現(xiàn)DAO的實(shí)例。部分代碼如下:
接口的實(shí)現(xiàn)類:
陸流程圖
5 結(jié)束語
采用MVC模式清晰將表達(dá)和內(nèi)容進(jìn)行了分離,開發(fā)人員負(fù)責(zé)Servlet和JavaBean,網(wǎng)頁設(shè)計(jì)人員負(fù)責(zé)JSP頁面的開發(fā),分工明確,非常適合大項(xiàng)目的開發(fā),同時(shí)采用該模式開發(fā)設(shè)計(jì)清晰,獨(dú)立性強(qiáng),易擴(kuò)充,易維護(hù)等優(yōu)點(diǎn),使各類人員都可以更加專注完成自己的工作,在Web開發(fā)中有顯著的優(yōu)勢。
參考文獻(xiàn):
[1] 雷鈞.MVC 設(shè)計(jì)模式在J2EE平臺上的應(yīng)用[J]. 微計(jì)算機(jī)信息,2006,22(7):45-48.
[2] 萬健,劉建華.基于MVC模式的JSP技術(shù)開發(fā)WebGIS[J].工程地球物理學(xué)報(bào),2009,6(2):241-243.
[3] 范蕓,范慧霞. JSP動(dòng)態(tài)網(wǎng)站開發(fā)基礎(chǔ)與上機(jī)指導(dǎo)[M].北京:清華大學(xué)出版社, 2010:245.