MVC模式簡介


MVC簡介

MVC的全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,是一種軟件設計典范。它是用一種業務邏輯、數據與界面顯示分離的方法來組織代碼,將眾多的業務邏輯聚集到一個部件里面,在需要改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯,達到減少編碼的時間。

MVC開始是存在於桌面程序中的,M是指業務模型,V是指用戶界面,C則是控制器

使用的MVC的目的:在於將M和V的實現代碼分離,從而使同一個程序可以使用不同的表現形式。比如Windows系統資源管理器文件夾內容的顯示方式,下面兩張圖中左邊為詳細信息顯示方式,右邊為中等圖標顯示方式,文件的內容並沒有改變,改變的是顯示的方式。不管用戶使用何種類型的顯示方式,文件的內容並沒有改變,達到M和V分離的目的。

在網頁當中,

V即View視圖是指用戶看到並與之交互的界面。比如由html元素組成的網頁界面,或者軟件的客戶端界面。MVC的好處之一在於它能為應用程序處理很多不同的視圖。在視圖中其實沒有真正的處理發生,它只是作為一種輸出數據並允許用戶操縱的方式。

M即model模型是指模型表示業務規則。在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的數據是中立的,模型與數據格式無關,這樣一個模型能為多個視圖提供數據,由於應用於模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性。

C即controller控制器是指控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理。它只是接收請求並決定調用哪個模型構件去處理請求,然后再確定用哪個視圖來顯示返回的數據。

下圖說明了三者之間的調用關系。

用戶首先在界面中進行人機交互,然后請求發送到控制器,控制器根據請求類型和請求的指令發送到相應的模型,模型可以與數據庫進行交互,進行增刪改查操作,完成之后,根據業務的邏輯選擇相應的視圖進行顯示,此時用戶獲得此次交互的反饋信息,用戶可以進行下一步交互,如此循環。

MVC舉例一:

最典型的MVC就是jsp+servlet+javabean模式。

JavaBean作為模型,既可以作為數據模型來封裝業務數據,又可以作為業務邏輯模型來包含應用的業務操作。其中,數據模型用來存儲或傳遞業務數據,而業務邏輯模型接收到控制器傳過來的模型更新請求后,執行特定的業務邏輯處理,然后返回相應的執行結果。

JSP作為表現層,負責提供頁面為用戶展示數據,提供相應的表單(Form)來用於用戶的請求,並在適當的時候(點擊按鈕)向控制器發出請求來請求模型進行更新。

Serlvet作為控制器,用來接收用戶提交的請求,然后獲取請求中的數據,將之轉換為業務模型需要的數據模型,然后調用業務模型相應的業務方法進行更新,同時根據業務執行結果來選擇要返回的視圖。

MVC舉例二:

Struts2框架:Struts2是基於MVC的輕量級的web應用框架。Struts2的應用范圍是Web應用,注重將Web應用領域的日常工作和常見問題抽象化,提供一個平台幫助快速的完成Web應用開發。基於Struts2開發的Web應用自然就能實現MVC,Struts2着力於在MVC的各個部分為開發提供相應幫助。

下面通過代碼來簡單解釋一下:

Login.html

Login.java

Struts.xml

用戶首先在Login.html中輸入用戶名和密碼,點擊登陸,此時根據action的路徑,在struts.xml中找到對應的Login,然后根據對應的class的路徑進入相應的login.Java,在這里判斷之后,返回success或error,然后根據struts.xml中的result值,指向相應的jsp頁面。

控制器——filterdispatcher

從上面這張圖來看,用戶請求首先到達前端控制器FilterDispatcher。FilterDispatcher負責根據用戶提交的URL和struts.xml中的配置,來選擇合適的動作(Action),讓這個Action來處理用戶的請求。FilterDispatcher其實是一個過濾器(Filter,servlet規范中的一種web組件),它是Struts2核心包里已經做好的類,不需要我們去開發,只是要在項目的web.xml中配置一下即可。FilterDispatcher體現了J2EE核心設計模式中的前端控制器模式。

動作——Action

在用戶請求經過FilterDispatcher之后,被分發到了合適的動作Action對象。Action負責把用戶請求中的參數組裝成合適的數據模型,並調用相應的業務邏輯進行真正的功能處理,獲取下一個視圖展示所需要的數據。Struts2的Action,相比於別的web框架的動作處理,它實現了與Servlet API的解耦,使得Action里面不需要再直接去引用和使用HttpServletRequest與HttpServletResponse等接口。因而使得Action的單元測試更加簡單,而且強大的類型轉換也使得我們少做了很多重復的工作。

視圖——Result

視圖結果用來把動作中獲取到的數據展現給用戶。在Struts2中有多種優秀的結果展示方式,常規的jsp,模板freemarker、velocity,還有各種其它專業的展示方式,如圖表jfreechart、報表JasperReports、將XML轉化為HTML的XSLT等等。而且各種視圖結果在同一個工程里面可以混合出現。

MVC舉例三:

ASP.NET MVC

在visual studio當中新建一個ASP.NET MVC web應用程序,

新建完成之后,創建的項目當中即有controllers,models和views,體現了MVC的編程思想。

MVC的優點:

1.耦合性

視圖層和業務層分離,這樣就允許更改視圖層代碼而不用重新編譯模型和控制器代碼,同樣,一個應用的業務流程或者業務規則的改變只需要改動MVC的模型層即可。因為模型與控制器和視圖相分離,所以很容易改變應用程序的數據層和業務規則。

2.重用性高

MVC模式允許使用各種不同樣式的視圖來訪問同一個服務器端的代碼,因為多個視圖能共享一個模型,它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器(wap),比如,用戶可以通過電腦也可通過手機來訂購某樣產品,雖然訂購的方式不一樣,但處理訂購產品的方式是一樣的。由於模型返回的數據沒有進行格式化,所以同樣的構件能被不同的界面使用。

3.部署快,生命周期成本低

MVC使開發和維護用戶接口的技術含量降低。使用MVC模式使開發時間得到相當大的縮減,它使程序員(Java開發人員)集中精力於業務邏輯,界面程序員(HTML和JSP開發人員)集中精力於表現形式上。

4.可維護性高

分離視圖層和業務邏輯層也使得WEB應用更易於維護和修改。

MVC的缺點:

1.完全理解MVC比較復雜。

由於MVC模式提出的時間不長,加上同學們的實踐經驗不足,所以完全理解並掌握MVC不是一個很容易的過程。

2.調試困難。

因為模型和視圖要嚴格的分離,這樣也給調試應用程序帶來了一定的困難,每個構件在使用之前都需要經過徹底的測試。

3.不適合小型,中等規模的應用程序

在一個中小型的應用程序中,強制性的使用MVC進行開發,往往會花費大量時間,並且不能體現MVC的優勢,同時會使開發變得繁瑣。

4.增加系統結構和實現的復雜性

對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增加結構的復雜性,並可能產生過多的更新操作,降低運行效率。

5.視圖與控制器間的過於緊密的連接並且降低了視圖對模型數據的訪問

視圖與控制器是相互分離,但卻是聯系緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。

依據模型操作接口的不同,視圖可能需要多次調用才能獲得足夠的顯示數據。對未變化數據的不必要的頻繁訪問,也將損害操作性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM