五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > MVC框架 實例以及MVC架構(gòu)的職責(zé)劃分原則

MVC框架 實例以及MVC架構(gòu)的職責(zé)劃分原則

文章來源:365jz.com     點擊數(shù):835    更新時間:2018-07-23 10:12   參與評論

MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。MVC被獨特的發(fā)展起來用于映射傳統(tǒng)的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結(jié)構(gòu)中。

MVC框架

         MVC(model,view,controller),一種將業(yè)務(wù)邏輯、數(shù)據(jù)、界面分離的方法組織代碼的框架。在改進界面及用戶交互的同時,不需要重寫業(yè)務(wù)邏輯。MVC將傳統(tǒng)的輸入、處理和輸出分離。

         Model:模型,邏輯部分,也是表示應(yīng)用程序的核心,比如說數(shù)據(jù)庫的表和記錄

         View:視圖,數(shù)據(jù)顯示,也是表示界面,是用于顯示的,比如說顯示數(shù)據(jù)庫的記錄

         Controller:控制器,用戶交互,也是表示處理的,比如說處理/增刪查改數(shù)據(jù)庫的記錄

        

         MVC中,視圖可以有多個,在視圖中沒有真正的處理,視圖只作為一種數(shù)據(jù)輸出的形式,一個允許用戶操作的平臺;模型中的代碼可以被多個視圖使用;控制器通過接受用戶的輸入、調(diào)用模型、調(diào)用視圖去完成用戶的請求,控制器也不做處理,只做接收請求然后通知相關(guān)的模型,再確定用哪個視圖來返回數(shù)據(jù)。

 

         MVC將視圖層和業(yè)務(wù)層分離,很容易改變應(yīng)用程序的數(shù)據(jù)層和業(yè)務(wù)規(guī)則,耦合性低且可維護性高。

         MVC中的模型可以被不同的視圖使用,重用性高。

 

Spring MVC

  基于JAVA實現(xiàn)MVC設(shè)計模式的請求驅(qū)動類型的輕量型WEB框架,即使用了MVC思想,將WEB層進行解耦。

  

  執(zhí)行流程:瀏覽器發(fā)送請求給控制器,控制器接收請求將請求委托給業(yè)務(wù)對象進行處理,然后將結(jié)果使用視圖渲染返回到瀏覽器。

簡單MVC實例

圖一:結(jié)構(gòu)圖

 

圖二:頁面介紹

 

 

以添加課程整個流程為例

1)在showCourse.jsp(View)中,有一添加課程的鏈接,使用action傳遞請求到courseServlet(Controller)

 

2)在courseServlet.java中,deGet方法

 

3)doPost方法,在其間判斷action做什么

 

4)找到addApply,執(zhí)行addApply(req,resp,out)方法

 

5)到上一步所說的方法,前段控制器,請求委托,到達addCourse.jsp頁面

 

6)addCourse.jsp又再次請求,addHandin,再次到達courseServlet中

7)此時執(zhí)行addHandin方法

 



最近負責(zé)一個項目,用了 Yii Framework 的 MVC 框架,剛開始自以為結(jié)構(gòu)很穩(wěn)健。

但是隨著對業(yè)務(wù)邏輯理解的深入,才開始意識到問題的嚴重。

我錯誤地理解了 MVC 中的 Controller,想當(dāng)然地根據(jù)以往的經(jīng)驗,把所有的業(yè)務(wù)邏輯都放在 Controlleraction 中去實現(xiàn)。

于是,每一個 Controller代碼都上千行,越來越臃腫。

最后,我下定決心重構(gòu)代碼,起源是一個對外開放 API 接口的需求。

按照現(xiàn)在的架構(gòu),代碼基本無法復(fù)用,我需要把很多功能再重復(fù)寫一遍,這實在是無法接受。

面向?qū)ο缶幊滩粌H僅是課本上的名詞??!

真正開始實踐才發(fā)現(xiàn),要有面向?qū)ο笠庾R,有全局觀,是多么難得的一件事情。

MVC設(shè)計原則

1 到底什么是 MVC

模型-視圖-控制器(MVC)是一種設(shè)計框架(設(shè)計模式)

MVC 的目標(biāo)將業(yè)務(wù)邏輯從用戶界面的考慮中分離。

這樣,開發(fā)者就可以更容易地改變每一部分而不會影響其他。

在 MVC 中,

  • Model 代表數(shù)據(jù)和業(yè)務(wù)規(guī)則;

  • View 包含了用戶界面元素,例如文本,表單等;

  • Controller 則管理模型和視圖中的通信。

MVC 在各種編程語言中均有實現(xiàn),例如 J2EE 應(yīng)用開發(fā)中,

View 可能由 jsp 實現(xiàn);Controller 是一個 servlet,現(xiàn)在一般用 Struts 實現(xiàn);Model 則是由一個實體 Bean 來實現(xiàn)。

2 我遇到了什么問題

Yii Framework 是一個流行的 PHP 框架,它借鑒了 Ruby on Rails 的 ActiveRecord(AR) 概念。

數(shù)據(jù)庫中的每一個 table 都可以用 AR 類來方便地進行增刪改查操作。

它把 AR 當(dāng)做 Model,并推薦放在一個名為 models 的目錄下面。

于是,我在自動生成表對應(yīng)的 AR 之后,便望文生義想當(dāng)然地認為已經(jīng)擁有了 Model 層。

其實,AR只不過是 DAO (數(shù)據(jù)訪問層),并不是 Model 層

我們的業(yè)務(wù)幾乎全放在了 Controller 里:對用戶提交上來的表單進行各種邏輯判斷,進行計算,實例化 AR 對數(shù)據(jù)進行存儲……

因為一個 Controller 中會有多個 action,每個 action 都有這樣的業(yè)務(wù)處理。

最后,我發(fā)現(xiàn)我的 Controller 代碼已經(jīng)超過了 1000 行。

突然有一天,leader 說,我們這個系統(tǒng)要開放 API 給現(xiàn)有的舊系統(tǒng)調(diào)用,要給第三方接口。

第三方只是要給定一個參數(shù),本系統(tǒng)給出個結(jié)果值而已,這其中的業(yè)務(wù)處理它是不關(guān)心的。

壞就壞在這里,Controller 已經(jīng)實現(xiàn)了那些業(yè)務(wù),但它是接受表單提交的,怎樣能夠也接受 SOAP 的 xml 文檔呢?

Controller 和套套一樣,應(yīng)該越薄越好。

它的職責(zé)應(yīng)該只是接受用戶的輸入,然后立刻轉(zhuǎn)發(fā)給別的類來處理。

這樣 Controller 只負責(zé)提供不同的接口,我們才能算是將業(yè)務(wù)邏輯分離出去,而分離出去的業(yè)務(wù)也很容易進行重用。

分離出來的這部分業(yè)務(wù)由誰來處理呢?答案應(yīng)該是 Model。

3 View的職責(zé)

View部分比較明確,就是負責(zé)顯示。

一切與顯示界面無關(guān)的東西,都不應(yīng)該出現(xiàn)在view里面。

因此,View 中一般不應(yīng)該出現(xiàn)復(fù)雜的判斷語句,以及復(fù)雜的運算過程。

可以有簡單的循環(huán)語句、格式化語句。比如,博客首頁的文字列表就是一種循環(huán)。

對于PHP的Web應(yīng)用而言,HTML是View中的主要內(nèi)容。

View應(yīng)該從不調(diào)用Model的寫方法

也就是說,View只從Model中讀取數(shù)據(jù),但不改寫Model。

所以我們說,View和Model是老死不相往來的。

而且,View中不直接訪問$_GET$_POST,應(yīng)該由Controller傳遞給View。

此外,View一般沒有任何準(zhǔn)備數(shù)據(jù)處理的內(nèi)容,如查詢數(shù)據(jù)庫等。

這些一般是放在Controller里面,并以變量的形式傳給視圖。

也就是說,視圖里面要用到的數(shù)據(jù),就是一個變量。

4 Model的職責(zé)

對于Model而言,最主要就是保存和輸出信息

比如,Post類必然有一個用于保存博客文章標(biāo)題的title屬性,必然有一個刪除的操作,這都是Model的內(nèi)容。

數(shù)據(jù)、行為、方法是Model的主要內(nèi)容。

實際工作中,Model是MVC中代碼量最大。

Model是邏輯最復(fù)雜的地方,因為應(yīng)用的業(yè)務(wù)邏輯也要在這里表示。

注意將Model與Controller區(qū)分開。

Model是處理業(yè)務(wù)方面的邏輯,Controller只是簡單的協(xié)調(diào)Model和View之間的關(guān)系。

只要是與業(yè)務(wù)有關(guān)的,就該放在Model里面。

數(shù)據(jù)校驗、public常量和變量,都應(yīng)該放在model層,

也就是說,有可能被重復(fù)使用的屬性或方法,都應(yīng)該放在model層,一次定義,到處使用。

Model不應(yīng)該訪問request、session以及其他環(huán)境數(shù)據(jù),這些應(yīng)該由Controller注入。

好的設(shè)計,應(yīng)該是胖Model,瘦Controller。

5 Controller的職責(zé)

對于Controller,主要是響應(yīng)用戶請求,決定使用什么視圖,需要準(zhǔn)備什么數(shù)據(jù)用來顯示。

因此,對于request的訪問代碼,應(yīng)該放在Controller里面,比如$_GET$_POST等。

Controller應(yīng)該僅限于獲取用戶請求數(shù)據(jù),不應(yīng)該對數(shù)據(jù)有任何操作或預(yù)處理,這應(yīng)該放在 Model 里面。

對于數(shù)據(jù)的寫操作,要調(diào)用Model類的方法完成。

對于用戶請求的響應(yīng),要調(diào)用視圖渲染。

此外,一般不要有HTML代碼等其他表現(xiàn)層的東西,這應(yīng)該是屬于View的內(nèi)容。

6 啟示

Yii Framework 的官方文檔中有這么一段:

In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.

簡言之,Rich Model is Better


如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇

發(fā)表評論 (835人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號