-
MVC框架
同義詞 MVC通常指MVC框架php
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面 顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。MVC被獨特的發展起來用於 映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。
簡介
MVC開始是存在於桌面程序中的,M是指業務模型,V是指
用戶界面,C則是控制器,使用MVC的目的是將M和V的實現代碼分離,從而使同一個程序可使用不一樣的表現形式。好比一批統計數據能夠分別用
柱狀圖、
餅圖來表示。C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新。
[1-2]
MVC 編程模式
MVC 是一種使用 MVC(Model View Controller 模型-視圖-控制器)設計建立 Web 應用程序的模式:
[1]
MVC 模式同時提供了對 HTML、CSS 和 JavaScript 的徹底控制。
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。
一般模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。
一般視圖是依據模型數據建立的。
Controller(控制器)是應用程序中處理用戶交互的部分。
一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。
MVC 分層有助於管理複雜的應用程序,由於您能夠在一個時間內專門關注一個方面。例如,您能夠在不依賴業務邏輯的狀況下專一於視圖設計。同時也讓應用程序的測試更加容易。
MVC 分層同時也簡化了分組開發。不一樣的開發人員可同時開發視圖、控制器邏輯和業務邏輯。
框架內容
MVC是一個框架模式,它強制性的使應用程序的輸入、處理和
輸出分開。使用MVC應用程序被分紅三個核心部件:模型、
視圖、控制器。它們各自處理本身的任務。最典型的MVC就是JSP +
servlet +
javabean的模式。
[5]
視圖
MVC好處是它能爲應用程序處理不少不一樣的
視圖。在視圖中其實沒有真正的處理髮生,無論這些數據是聯機存儲的仍是一個僱員列表,做爲視圖來說,它只是做爲一種輸出數據並容許用戶操縱的方式。
[6]
模型
模型表示企業數據和業務規則。在MVC的三個部件中,模型擁有最多的處理任務。例如它可能用像
EJBs和ColdFusion Components這樣的構件對象來處理數據庫,被模型返回的數據是中立的,就是說模型與數據格式無關,這樣一個模型能爲多個視圖提供數據,因爲應用於模型的代碼只需寫一次就能夠被多個視圖重用,因此減小了代碼的重複性。
[6]
控制器
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求,因此當單擊Web頁面中的超連接和發送
HTML表單時,控制器自己不輸出任何東西和作任何處理。它只是接收請求並決定調用哪一個模型構件去處理請求,而後再肯定用哪一個視圖來顯示返回的數據。
[6]
框架和設計模式的區別
有不少程序員每每把框架模式和設計模式混淆,認爲MVC是一種設計模式。實際上它們徹底是不一樣的概念。
[7]
框架、設計模式這兩個概念總容易被混淆,其實它們之間仍是有區別的。框架 一般是代碼重用,而設計模式是設計重用,架構則介於二者之間,部分代碼重用,部分設計重用,有時分析也可重用。在軟件生產中有三種級別的重用:內部重用, 即在同一應用中能公共使用的抽象塊;代碼重用,即將通用模塊組合成庫或工具集,以便在多個應用和領域都能使用;應用框架的重用,即爲專用領域提供通用的或 現成的基礎結構,以得到最高級別的重用性。
框架與設計模式雖然類似,但卻有着根本的不一樣。設計模式是對在某種環境中 反覆出現的問題以及解決該問題的方案的描述,它比框架更抽象;框架能夠用代碼表示,也能直接執行或複用,而對模式而言只有實例才能用代碼表示;設計模式是 比框架更小的元素,一個框架中每每含有一個或多個設計模式,框架老是針對某一特定應用領域,但同一模式卻可適用於各類應用。能夠說,框架是軟件,而設計模 式是軟件的知識。
框架模式有哪些?
框架有哪些?
設計模式有哪些?
簡而言之:框架是大智慧,用來對軟件設計進行分工;設計模式是小技巧,對具體問題提出解決方案,以提升代碼複用率,下降耦合度。
常見框架 編輯
Struts
Struts是
Apache軟 件基金下Jakarta項目的一部分。Struts框架的主要架構設計和開發者是Craig R.McClanahan。Struts 是Java Web MVC框架中不爭的王者。通過長達九年的發展,Struts已經逐漸成長爲一個穩定、成熟的框架,而且佔有了MVC框架中最大的市場份額。可是 Struts某些技術特性上已經落後於新興的MVC框架。面對
Spring MVC、Webwork2這些設計更精密,擴展性更強的框架,Struts受到了史無前例的挑戰。但站在產品開發的角度而言,Struts仍然是最穩妥的選擇。
Struts有一組相互協做的類(組件)、
Servlet以 及jsp tag lib組成。基於struts構架的web應用程序基本上符合JSP Model2的設計標準,能夠說是MVC設計模式的一種變化類型。根據上面對framework的描述,很容易理解爲何說Struts是一個web framework,而不只僅是一些標記庫的組合。但 Struts 也包含了豐富的標記庫和獨立於該框架工做的實用程序類。Struts有其本身的控制器(
Controller),同時整合了其餘的一些技術去實現模型層(
Model)和視圖層(View)。在模型層,Struts能夠很容易的與數據訪問技術相結合,包括
EJB,
JDBC和Object Relation Bridge。在視圖層,Struts可以與JSP, Velocity Templates,XSL等等這些表示層組件相結合。
[8]
Spring
Spring其實是Expert One-on-One J2EE Design and Development 一書中所闡述的設計思想的具體實現。在One-on-One 一書中,
Rod Johnson倡導
J2EE實用主義的
設計思想, 並隨書提供了一個初步的開發框架實現(interface21 開發包)。而Spring 正是這一思想的更全面和具體的體現。Rod Johnson 在interface21 開發包的基礎之上,進行了進一步的改造和擴充,使其發展爲一個更加開放、清晰、全面、高效的開發框架。
Spring是一個開源框架,由Rod Johnson建立而且在他的著做《J2EE設計開發編程指南》裏進行了描述。它是爲了解決企業應用開發的複雜性而建立的。Spring使使用基本的 JavaBeans來完成之前只可能由EJB完成的事情變得可能了。然而,Spring的用途不只限於服務器端的開發。從簡單性、可測試性和鬆耦合的角度 而言,任何Java應用均可以從Spring中受益。
簡單來講,Spring是一個輕量的控制反轉和麪向切面的容
框架。固然,這個描述有點過於簡單。但它的確歸納出了Spring是作什麼的。
[8]
ZF
Zend Framework(簡寫ZF)是由 Zend 公司支持開發的徹底基於 PHP5 的開源PHP開發框架,可用於開發 Web 程序和服務,ZF採用 MVC(Model–View-Controller) 架構模式來分離應用程序中不一樣的部分方便程序的開發和維護。
(MVC框架的詳細使用及其相關具體操做能夠閱讀參考資料:
[8]
或者擴展閱讀第二,三,四條。)
.NET
.NET MVC
[9]
是微軟官方提供的以MVC模式爲基礎的.NET Web應用程序(Web Application)框架,它由Castle的
MonoRail而來(Castle的MonoRail是由java而來),目前最新版本是.N 4.5。
[10]
優勢
視圖層和業務層分離,這樣就容許更改視圖層代碼而不用從新編譯模型和控制器代碼,一樣,一個應用的業務流程或者業務規則的改變只須要改動MVC的模型層便可。由於模型與控制器和視圖相分離,因此很容易改變應用程序的數據層和業務規則。
模型是自包含的,而且與控制器和視圖相分離,因此很容易改變應用程序的數據層和業務規則。若是把數據庫從MySQL移植到
Oracle,或者改變基於RDBMS數據源到
LDAP,只需改變模型便可。一旦正確的實現了模型,無論數據來自數據庫或是LDAP服務器,視圖將會正確的顯示它們。因爲運用MVC的應用程序的三個部件是相互獨立,改變其中一個不會影響其它兩個,因此依據這種設計思想能構造良好的
鬆耦合的構件。
[11]
重用性高
隨着技術的不斷進步,須要用愈來愈多的方式來訪問應用程序。
MVC模式允 許使用各類不一樣樣式的視圖來訪問同一個服務器端的代碼,由於多個視圖能共享一個模型,它包括任何WEB(HTTP)瀏覽器或者無線瀏覽器(wap),比 如,用戶能夠經過電腦也可經過手機來訂購某樣產品,雖然訂購的方式不同,但處理訂購產品的方式是同樣的。因爲模型返回的數據沒有進行格式化,因此一樣的 構件能被不一樣的界面使用。例如,不少數據可能用HTML來表示,可是也有可能用WAP來表示,而這些表示所須要的命令是改變視圖層的實現方式,而控制層和 模型層無需作任何改變。因爲已經將數據和業務規則從表示層分開,因此能夠最大化的重用代碼了。模型也有狀態管理和數據持久性處理的功能,例如,基於會話的 購物車和電子商務過程也能被Flash網站或者無線聯網的應用程序所重用。
[11]
部署快
使用MVC模式使開發時間獲得至關大的縮減,它使程序員(Java開發人員)集中精力於業務邏輯,界面程序員(HTML和JSP開發人員)集中精力於表現形式上。
可維護性高
分離視圖層和業務邏輯層也使得WEB應用更易於維護和修改。
有利軟件工程化管理
因爲不一樣的層各司其職,每一層不一樣的應用具備某些相同的特徵,有利於經過 工程化、工具化管理程序代碼。控制器也提供了一個好處,就是可使用控制器來聯接不一樣的模型和視圖去完成用戶的需求,這樣控制器能夠爲構造應用程序提供強 有力的手段。給定一些可重用的模型和視圖,控制器能夠根據用戶的需求選擇模型進行處理,而後選擇視圖將處理結果顯示給用戶。
[12-13]
缺點
沒有明確的定義
徹底理解MVC並非很容易。使用MVC須要精心的計劃,因爲它的內部原理比較複雜,因此須要花費一些時間去思考。同時因爲模型和視圖要嚴格的分離,這樣也給調試應用程序帶來了必定的困難。每一個構件在使用以前都須要通過完全的測試。
不適合小型,中等規模的應用程序
花費大量時間將MVC應用到規模並非很大的應用程序一般會得不償失。
增長系統結構和實現的複雜性
對於簡單的界面,嚴格遵循MVC,使模型、視圖與控制器分離,會增長結構的複雜性,並可能產生過多的更新操做,下降運行效率。
視圖與控制器間的過於緊密的鏈接
視圖與控制器是相互分離,但倒是聯繫緊密的部件,視圖沒有控制器的存在,其應用是頗有限的,反之亦然,這樣就妨礙了他們的獨立重用。
視圖對模型數據的低效率訪問
依據模型操做接口的不一樣,視圖可能須要屢次調用才能得到足夠的顯示數據。對未變化數據的沒必要要的頻繁訪問,也將損害操做性能。
通常高級的界面工具或構造器不支持模式
改造這些工具以適應MVC須要和創建分離的部件的代價是很高的,會形成MVC使用的困難。
[12-13]
外界評價 編輯
根據天極網資料顯示:基於Web的MVC framework在J2EE的世界內已經是空前繁榮,
TTS網 站上幾乎每隔一兩個星期就會有新的MVC框架發佈,比較好的MVC,老牌的有Struts、Webwork。新興的MVC 框架有Spring MVC、Tapestry、JSF等。這些大可能是著名團隊的做品,另外還有一些邊緣團隊的做品,也至關出色,如Dinamica、
VRaptor等,這些框架都提供了較好的層次分隔能力,在實現良好的MVC 分隔的基礎上,經過提供一些現成的輔助類庫,同時也促進了生產效率的提升。
[8]
如何選擇一個好的框架應用在項目中,將會對項目的效率和可重用是相當重要的。
[8]
MVC控件 編輯
在
ASP
.NET MVC框架中沒有了本身的控件,頁面顯示徹底就回到了寫
html代 碼的年代。還好在 asp .net mvc框架中也有自帶的HtmlHelper和UrlHelper兩個幫助類。另外在MvcContrib擴展項目中也有擴展一些幫助類,這樣咱們就不光 只能使用完整的html來編寫了須要顯示的頁面了,就可使用這些幫助類來完成,但最後運行時都仍是要生成html代碼的。
HtmlHelper類
HtmlHelper類位於System.Web.MVC.Html命名空間下。主要包括FormExtensions,InputExtensions,
LinkExtensions,SelectExtensions,TextAreaExtensions,ValidationExtensions,RenderPartialExtensions等7個靜態類,他們所有是是採用拓展方法來實現的。
InputExtensions類:主要有5種類型的擴展方法,分別用於CheckBox控件、Hidden控件、Pass控件、RadionButton控件和TextBox控件
LinkExtensions類:該類主要用於生成相關連接,主要擴展了ActionLink和RouteLink方法。
ActionLink:擴展方法主要實現一個鏈接,共有十個重載方法。
UrlHelper幫助類
看類名也都知道這個類是用來成URL在 ASP .NET MVC應用程序中。
UrlHelper提供了四個很是經常使用的四個方法。
1.Action方法經過提供Controller,Action和各類參數生成一個URL,
2.Content方法是將一個虛擬的,相對的路徑轉換到應用程序的絕對路徑,
3.Encode方法是對URL地址進行加密,與Server.Encode方法同樣。
4.RouteUrl方法是提供在當前應用程序中規定的路由規則中匹配出URL。
另外還有兩個屬性,分別是RequestContext和RouteCollection兩個屬性,分別指的是包含HTTP上下文和RouteData兩個屬性,另外,RouteCollection是整個當前應用程序中規定的路由規則。
微軟提供的HtmlHelper已是足夠大部分開發人員使用了,可是有一些功能要用微軟提供的HtmlHelper可能還不知足要求。接下來就談談如何自定義的過程。
首先自定義的方法就是對HtmlHelper對象的擴展。
擴展方法實現的三要素:一、靜態類 二、靜態方法 三、this關鍵字
一、先定義一個類,例如:MyHtmlHelper:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MvcApplicationFirstDome.Models {
//靜態類
public static class MyHtmlHelper
{
//靜態方法
}
}
二、假設要擴展的方式是GetSpan,做用就是當你傳入參數時,內部封裝了以後返回結果,代碼以下。注意在MyHtmlHelper類中要引用using System.Web.Mvc命名空間。
//靜態方法
public static string GetSpan(this HtmlHelper htmlHelper,string text)
{
return "<span style='color:Red'>"+text+"</span>";
}
通過上面兩步以後HtmlHelper的擴展方法GetSpan基本可使用了,接下來就講解如何在頁面調用了。
在調用的時候要注意下一命名空間:若是擴展方法的命名空間和頁面的命名空間不一樣的就必須引用擴展方法的
命名空間,不然在頁面是沒有辦法調用自定義的方法的。
引用完命名空間以後,就能夠在相應的頁面調用自定義的擴展方法了。
對於某些項目來講,自定義控件過於複雜和浪費時間。這個時候也能夠從技術社區或是源代碼站下載適合本身需求的Mvc控件。如一些控件套包,表格控件等。
[14]