說說mvc模式_ailiandeziwei的專欄
本文關(guān)鍵詞:mvc開發(fā),由筆耕文化傳播整理發(fā)布。
MVC是 模型(Model),視圖(View)和控制(Controller)的縮寫,其目的實現(xiàn)Web系統(tǒng)的職能分工。
其中Model層實現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通?梢杂肑avaBean或EJB來實現(xiàn);
View層用于與用戶的交互,通常用JSP來實現(xiàn);
Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請求并選擇恰當(dāng)?shù)囊晥D以用于顯示,
同時它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計典范,
用于組織代碼用一種業(yè)務(wù)邏輯和數(shù)據(jù)顯示分離的方法,這個方法的假設(shè)前提是如果業(yè)務(wù)邏輯被聚集到一個部件里面,
而且界面和用戶圍繞數(shù)據(jù)的交互能被改進和個性化定制而不需要重新編寫業(yè)務(wù)邏輯MVC被獨特的發(fā)展起來用于映射傳統(tǒng)的輸入、
處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中。
[1] MVC開始是存在于Desktop程序中的,M是指數(shù)據(jù)模型,V是指用戶界面,C則是控制器,
使用MVC的目的是將M和V的實現(xiàn)代碼分離,從而使同一個程序可以使用不同的表現(xiàn)形式。
比如一批統(tǒng)計數(shù)據(jù)可以分別用柱狀圖、餅圖來表示。
C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。[2-3]
模型-視圖-控制器(MVC)是Xerox PARC在二十世紀八十年代為編程語言Smalltalk-80發(fā)明的一種軟件設(shè)計模式,已被廣泛使用。
后來被推薦為Oracle旗下Sun公司Java EE平臺的設(shè)計模式,并且受到越來越多的使用 ColdFusion 和 PHP 的開發(fā)者的歡迎。
模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點。
[4]編輯本段三層架構(gòu) MVC是一個設(shè)計模式,它強制性的使應(yīng)用程序的輸入、處理和輸出分開。
使用MVC應(yīng)用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務(wù)。
視圖 視圖是用戶看到并與之交互的界面。對老式的Web應(yīng)用程序來說 MVC模式圖
[5],視圖就是由HTML元素組成的界面,在新式的Web應(yīng)用程序中,HTML依舊在視圖中扮演著重要的角色,但一些新的技術(shù)已層出不窮,
它們包括Adobe Flash和象XHTML,XML/XSL,WML等一些標識語言和
Web services. MVC好處是它能為應(yīng)用程序處理很多不同的視圖。
在視圖中其實沒有真正的處理發(fā)生,不管這些數(shù)據(jù)是聯(lián)機存儲的還是一個雇員列表,作為視圖來講,它只是作為一種輸出數(shù)據(jù)并允許用戶操縱的方
式。 模型 模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)規(guī)則。在MVC的三個部件中,模型擁有最多的處理任務(wù)。
例如它可能用象EJBs和ColdFusion Components這樣的構(gòu)件對象來處理數(shù)據(jù)庫,被模型返回的數(shù)據(jù)是中立的,
就是說模型與數(shù)據(jù)格式無關(guān),這樣一個模型能為多個視圖提供數(shù)據(jù),由于應(yīng)用于模型的代碼只需寫一次就可以被多個視圖重用,
所以減少了代碼的重復(fù)性!
控制器 控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求,所以當(dāng)單擊Web頁面中的超鏈接和發(fā)送HTML表單時,
控制器本身不輸出任何東西和做任何處理。它只是接收請求并決定調(diào)用哪個模型構(gòu)件去處理請求,然后再確定用哪個視圖來顯示返回的數(shù)據(jù)。
[6]編輯本段設(shè)計模式 表現(xiàn)層(Presentation layer)
包含表示代碼、用戶交互GUI、數(shù)據(jù)驗證。該層用于向客戶端
設(shè)計模式圖
[7]用戶提供GUI交互,它允許用戶在顯示系統(tǒng)中輸入和編輯數(shù)據(jù),同時系統(tǒng)提供數(shù)據(jù)驗證功能。
業(yè)務(wù)邏輯層(Business layer) 包含業(yè)務(wù)規(guī)則處理代碼,即程序中與業(yè)務(wù) 相關(guān)專業(yè)算法、業(yè)務(wù)政策等等。
該層用于執(zhí)行業(yè)務(wù)流程和制訂數(shù)據(jù)的業(yè)務(wù)規(guī)則。業(yè)務(wù)邏輯層主要面向業(yè)務(wù)應(yīng)用,為表示層提供業(yè)務(wù)服務(wù)。
數(shù)據(jù)持久層(Persistence layer) 包含數(shù)據(jù)處理代碼和數(shù)據(jù)存儲代碼。
數(shù)據(jù)持久層主要包括數(shù)據(jù)存取服務(wù),負責(zé)與數(shù)據(jù)庫管理系統(tǒng)(如數(shù)據(jù)庫)之間的通信。
三個層次的每一層在處理程序上有各自明確的任務(wù),在功能實現(xiàn)上有清晰的區(qū)分,
各層與其余層分離,但各層之間存有通信接口。
[8]編輯本段框架類別Strut
在 Struts 中,已經(jīng)由一個 Struts 體系結(jié)構(gòu)
[9]名為 ActionServlet 的 Servlet充當(dāng)控制器(Controller)的角色,根據(jù)描述模型、視圖、控制器對應(yīng)關(guān)系的 struts-config.xml
的配置文件,轉(zhuǎn)發(fā)視圖(View)的請求,組裝響應(yīng)數(shù)據(jù)模型(Model)。
在 MVC 的 模型(Model)部分,經(jīng)常劃分為兩個主要子系統(tǒng)(系統(tǒng)的內(nèi)部數(shù)據(jù)狀態(tài)與改變數(shù)據(jù)狀態(tài)的邏輯動作),
這兩個概念子系統(tǒng)分別具體對應(yīng) Struts 里的 ActionForm 與 Action 兩個需要繼承實現(xiàn)超類。在這里,Struts
可以與各種標準的數(shù)據(jù)訪問技術(shù)結(jié)合在一起,包括Enterprise Java Beans(EJB),JDBC 與 JNDI。在 Struts 的視圖(View) 端,
除了使用標準的JavaServer Pages(JSP)以外,還提供了大量的標簽庫使用,同時也可以與其他表現(xiàn)層組件技術(shù)(產(chǎn)品)進行整合,
比如 Velocity Templates,XSLT等。通過應(yīng)用 Struts 的框架,最終用戶可以把大部分的關(guān)注點放在自己的業(yè)務(wù)邏輯(Action)與
映射關(guān)系的配置文件(struts-config.xml)中。
[10]
WebWork
WebWork是建立在稱為XWork的
Webwork模式圖
[11]Command模式框架之上的強大的基于Web的MVC框架。
WebWork的特性包括:
1. 靈活的Validation框架:允許在XML文件中定義驗證內(nèi)容,在運行時通過Interceptor自動應(yīng)用,因此完全脫離Action類。
新版支持客戶端驗證。
2. Type conversion:允許在類之間很容易轉(zhuǎn)換對象。
3. OGNL(Object Graphical Navigation Language)表達式語言:允許動態(tài)對象圖表遍歷和方法執(zhí)行,
使用ValueStack透明訪問多Beans的屬性。
WW2也具有使用JSTL的能力。
4.IoC(Inversion of Control)容器:管理組件的生命周期,使客戶獲得組件實例不需要創(chuàng)建注冊類(與容器環(huán)境無關(guān))。
5. FreeMarker Templates:使UI組件可重用,從而允許開發(fā)者容易定制Web頁面的look & feel。
6. Interceptors:在Actions處理的前后動態(tài)攔截,以簡單化Action代碼,增加減少代碼的機會。
7. 支持I18N。 8. 容易和第三方軟件集成,包括Hibernate, Spring, Pico, Sitemesh等。 9. 支持多種視圖技術(shù),如JSP,Velocity,F(xiàn)reeMarker,JasperReports,XML等。 10. 支持Packages和Namespaces,來管理Actions!12-13]
Spring
Spring框架提供了一個全面的規(guī)劃和配置現(xiàn)代化的基 Spring高層架構(gòu)圖
[14]于Java的企業(yè)應(yīng)用模型 - 對任何種類的部署平臺。spring的一個關(guān)鍵因素是在應(yīng)用程序級的基建支持重點企業(yè)應(yīng)用的“管道”,使團隊能夠?qū)W⒂趹?yīng)用程序級的業(yè)務(wù)邏輯,沒有特定的部署環(huán)境中的不必要的關(guān)系。 spring包括: XML和基于注解的配置風(fēng)格靈活的依賴注入 先進的面向方面編程的支持與基于代理和基于AspectJ的變種 支持聲明性事務(wù),緩存的聲明,聲明確認,聲明格式 與常見的Java EE規(guī)范,如JDBC,JPA JTA和JMS工作的強大抽象 一流的支持,共同開源框架如Hibernate和石英
一個靈活的網(wǎng)絡(luò)框架構(gòu)建RESTful MVC應(yīng)用程序和服務(wù)端點 單元測試,集成測試以及豐富的測試設(shè)施。[15]
JSF
這個是一個規(guī)范,Sun的和Apache的都有各自的實現(xiàn)。用戶量很大,被眾多IDE支持,JavaServer Faces (JSF) 是一種用于構(gòu)建 Web 應(yīng)用程序的新標準 Java 框架。它提供了一種以組件為中心來開發(fā) Java Web 用戶界面的方法,從而簡化了開發(fā)。JavaServer Faces 還引起了廣大 Java/Web 開發(fā)人員的興趣!捌髽I(yè)開發(fā)人員”和 Web 設(shè)計人員將發(fā)現(xiàn) JSF 開發(fā)可以簡單到只需將用戶界面 (UI) 組件拖放到頁面上,而“系統(tǒng)開發(fā)人員”將發(fā)現(xiàn)豐富而強健的JSF API為他們提供了無與倫比的功能和編程靈活性。JSF
還通過將良好構(gòu)建的模型-視圖-控制器 (MVC) 設(shè)計模式集成到它的體系結(jié)構(gòu)中,確保了應(yīng)用程序具有更高的可維護性。最后,由于 JSF 是通過 Java Community Process (JCP) 開發(fā)的一種 Java 標準,因此開發(fā)工具供應(yīng)商完全能夠為 JavaServer Faces 提供易于使用的、高效的可視化開發(fā)環(huán)境。[16-17]
Tapestry
最徹底的mvc開發(fā)框架,豐富的組件資源,重用性很高。組件扮演著控制器Controller的角色,是模式層(Model) 中pure-domain objects和包含有組件的HTML模板之間的媒介。大多數(shù)情況下,這種方式應(yīng)用于頁面(頁面也 是 Tapestry組件),但是在某些情況中,一個組件擁有自己的模板,包含著更多的組件,并且支持與使用者的互交。頁面通過配置一系列屬性表達式(Property expressions)連接模式層和表現(xiàn)層。屬性表達式使用另外一種開源框架OGNL(Object Graph
Navigation Language)。OGNL的開源工程(project)獨立于Tapestry,但是在Tapestry中起很重要的作用。OGNL主要的目的在于讀取和更新對象的Java Bean屬性。[18]
ASP.NET
ASPNETMVC在現(xiàn)有的ASP.NET 3.5運行時的基礎(chǔ)上提供了一個新的MVC框架。開發(fā)人員可以用MVC設(shè)計模式來構(gòu)建Web應(yīng)用,做到清晰的概念分離(UI或者視圖與業(yè)務(wù)應(yīng)用邏輯分離, 應(yīng)用邏輯和后端數(shù)據(jù)分離),同時還可以使用測試驅(qū)動開發(fā)。ASP.NET MVC框架為Web應(yīng)用的目錄結(jié)構(gòu)定義了一個專用的模式,還提供了一個controller基類,用來處理發(fā)動到“action”的請求。開發(fā)人員還可以 用上這個版本中所特有的Visual Studio 2008MVC模板,利用模板所提供的單元測試結(jié)構(gòu)來輔助Web應(yīng)用開發(fā)。
要讓一個懂 ASP.NET 的人主動學(xué)習(xí) ASP.NET MVC還真的不是一件容易的事,,畢竟這兩者之間還是有一些鴻溝的,而且還要放棄掉一些曾經(jīng)擁有(可能還是引以為豪)的知識,例如:服務(wù)端控件 (Server Control)開發(fā)。但是讓一個懂 Java 或 PHP/Ruby的人進入 ASP.NET MVC 的世界應(yīng)該是比進入Webform的世界容易多了 。[19]編輯本段優(yōu)缺點優(yōu)點
耦合性低 視圖層和業(yè)務(wù)層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應(yīng)用的業(yè)務(wù)流程或者業(yè)務(wù)規(guī)則的改變只需要改動MVC的模型層即可。因為模型與控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。 模型是自包含的,并且與控制器和視圖相分離,所以很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則。如果把數(shù)據(jù)庫從MySQL移植到Oracle,或者改變基于RDBMS數(shù)據(jù)源到LDAP,只需改變模型即可。一旦正確的實現(xiàn)了模型,不管數(shù)據(jù)來自數(shù)據(jù)庫或是LDAP服務(wù)器,視圖將會正確的顯示它們。由于運用MVC的應(yīng)用程序的三個部件是相互獨立,改變其中一個不會影響其它兩個,所以依據(jù)這種設(shè)計思想能構(gòu)造良好的松耦合的構(gòu)件。
重用性高 隨著技術(shù)的不斷進步,現(xiàn)在需要用越來越多的方式來訪問應(yīng)用程序。MVC模式允許使用各種不同樣式的視圖來訪問同一個服務(wù)器端的代碼,因為多個視圖能共享一個模型,它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器(wap),比如,用戶可以通過電腦也可通過手機來訂購某樣產(chǎn)品,雖然訂購的方式不一樣,但處理訂購產(chǎn)品的方式是一樣的。由于模型返回的數(shù)據(jù)沒有進行格式化,所以同樣的構(gòu)件能被不同的界面使用。例如,很多數(shù)據(jù)可能用HTML來表示,但是也有可能用WAP來表示,而這些表示所需要的命令是改變視圖層的實現(xiàn)方式,而控制層和模型層無需做任何改變。由于已經(jīng)將數(shù)據(jù)和業(yè)務(wù)規(guī)則從表示層分開,所以可以最大化的重用代碼了。模型也有狀態(tài)管理和數(shù)據(jù)持久性處理的功能,例如,基于會話的購物車和電子商務(wù)過程也能被Flash網(wǎng)站或者無線聯(lián)網(wǎng)的應(yīng)用程序所重用!
生命周期成本低 MVC使開發(fā)和維護用戶接口的技術(shù)含量降低! 部署快 使用MVC模式使開發(fā)時間得到相當(dāng)大的縮減,它使程序員(Java開發(fā)人員)集中精力于業(yè)務(wù)邏輯,界面程序員(HTML和JSP開發(fā)人員)集中精力于表現(xiàn)形式上! 可維護性高 分離視圖層和業(yè)務(wù)邏輯層也使得WEB應(yīng)用更易于維護和修改! 有利軟件工程化管理 由于不同的層各司其職,每一層不同的應(yīng)用具有某些相同的特征,有利于通過工程化、工具化管理程序代碼?刂破饕蔡峁┝艘粋好處,就是可以使用控制器來聯(lián)接不同的模型和視圖去完成用戶的需求,這樣控制器可以為構(gòu)造應(yīng)用程序提供強有力的手段。給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇模型進行處理,然后選擇視圖將處理結(jié)果顯示給用戶。[20-21]
缺點
沒有明確的定義 完全理解MVC并不是很容易。使用MVC需要精心的計劃,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考。同時由于模型和視圖要嚴格的分離,這樣也給調(diào)試應(yīng)用程序帶來了一定的困難。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試。 不適合小型,中等規(guī)模的應(yīng)用程序 花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序通常會得不償失。 增加系統(tǒng)結(jié)構(gòu)和實現(xiàn)的復(fù)雜性 對于簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結(jié)構(gòu)的復(fù)雜性,并可能產(chǎn)生過多的更新操作,降低運行效率。 視圖與控制器間的過于緊密的連接
視圖與控制器是相互分離,但卻是聯(lián)系緊密的部件,視圖沒有控制器的存在,其應(yīng)用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。 視圖對模型數(shù)據(jù)的低效率訪問 依據(jù)模型操作接口的不同,視圖可能需要多次調(diào)用才能獲得足夠的顯示數(shù)據(jù)。對未變化數(shù)據(jù)的不必要的頻繁訪問,也將損害操作性能。 一般高級的界面工具或構(gòu)造器不支持模式 改造這些工具以適應(yīng)MVC需要和建立分離的部件的代價是很高的,從而造成MVC使用的困難。
本文關(guān)鍵詞:mvc開發(fā),由筆耕文化傳播整理發(fā)布。
本文編號:161459
本文鏈接:http://sikaile.net/wenshubaike/xxkj/161459.html