模型 - 視圖 - 控制器( MVC )是 80 年代 Smalltalk-80 出現(xiàn)的一種軟件設(shè)計(jì)模式,現(xiàn)在已經(jīng)被廣泛的使用。
????
?
?
1
、模型(
Model
)
模型是應(yīng)用程序的主體部分。模型表示業(yè)務(wù)數(shù)據(jù),或者業(yè)務(wù)邏輯
.
2
、視圖(
View
)
視圖是應(yīng)用程序中用戶(hù)界面相關(guān)的部分,是用戶(hù)看到并與之交互的界面。
3
、控制器(
controller)
控制器工作就是根據(jù)用戶(hù)的輸入,控制用戶(hù)界面數(shù)據(jù)顯示和更新
model
對(duì)象狀態(tài)。
MVC
式的出現(xiàn)不僅實(shí)現(xiàn)了功能模塊和顯示模塊的分離,同時(shí)它還提高了應(yīng)用系統(tǒng)的可維護(hù)性、可擴(kuò)展性、可移植性和組件的可復(fù)用性
早期的程序中,如果不注意對(duì)數(shù)功能和顯示的解耦合,常常會(huì)導(dǎo)致程序的復(fù)雜及難以維護(hù)。很多
VB,Delphi
等
RAD
程序都有這種問(wèn)題。甚至現(xiàn)在的
C#,Java
有時(shí)候也會(huì)出現(xiàn)把業(yè)務(wù)邏輯寫(xiě)在顯示模塊中的現(xiàn)象
管
MVC
設(shè)計(jì)模式很早就提出,但在
Web
項(xiàng)目的開(kāi)發(fā)中引入
MVC
卻是步履維艱。主要原因:一是在早期的
Web
項(xiàng)目的開(kāi)發(fā)中,程序語(yǔ)言和
HTML
的分離一直難以實(shí)現(xiàn)。
CGI
程序以字符串輸出的形式動(dòng)態(tài)地生成
HTML
內(nèi)容。后來(lái)隨著腳本語(yǔ)言的出現(xiàn),前面的方式又被倒了過(guò)來(lái),改成將腳本語(yǔ)言書(shū)寫(xiě)的程序嵌入在
HTML
內(nèi)容中。這兩種方式有一個(gè)相同的不足之處即它們總是無(wú)法將程序語(yǔ)言和
HTML
分離。二是腳本語(yǔ)言的功能相對(duì)較弱,缺乏支持
MVC
設(shè)計(jì)模式的一些必要的技術(shù)基礎(chǔ)。
??????? mode1?1 是一個(gè)以 JSP 文件為中心的模式,在這種模式中 JSP 頁(yè)面不僅負(fù)責(zé)表現(xiàn)邏輯,也負(fù)責(zé)控制邏輯。專(zhuān)業(yè)書(shū)籍上稱(chēng)之為邏輯耦合在頁(yè)面中,這種處理方式,對(duì)一些規(guī)模很小的項(xiàng)目如:一個(gè)簡(jiǎn)單的留言簿,也沒(méi)什么太大的壞處,實(shí)際上,人們開(kāi)始接觸一些對(duì)自己來(lái)說(shuō)是新的東西的時(shí)候,比如,用 JSP 訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí),往往喜歡別人能提供一個(gè)包含這一切的單個(gè) JSP 頁(yè)面,因?yàn)檫@樣在一個(gè)頁(yè)面上他就可以把握全局,便于理解。但是,用 Model?1 模式開(kāi)發(fā)大型時(shí),程序流向由一些互相能夠感知的頁(yè)面決定,當(dāng)頁(yè)面很多時(shí)要清楚地把握其流向?qū)⑹呛軓?fù)雜的事情,當(dāng)您修改一頁(yè)時(shí)可能會(huì)影響相關(guān)的很多頁(yè)面,大有牽一發(fā)而動(dòng)全身的感覺(jué),使得程序的修改與維護(hù)變得異常困難;還有一個(gè)問(wèn)題就是程序邏輯開(kāi)發(fā)與頁(yè)面設(shè)計(jì)糾纏在一起,既不便于分工合作也不利于代碼的重用,這樣的程序其健壯性和可伸縮性都不好。 Grady?Booch 等人在 UML 用戶(hù)指南一書(shū)中,強(qiáng)調(diào)建模的重要性時(shí),打了一個(gè)制作狗窩、私人住宅、和大廈的形象比喻來(lái)說(shuō)明人們處理不同規(guī)模的事物時(shí)應(yīng)該采用的合理方法一樣,人們對(duì)不同規(guī)模的應(yīng)用程序也應(yīng)該采用不同的模式
為了克服 Model?1 的缺陷,人們引入了 Model?2
它引入了 \" 控制器 \" 這個(gè)概念,控制器一般由 servlet 來(lái)?yè)?dān)任,客戶(hù)端的請(qǐng)求不再直接送給一個(gè)處理業(yè)務(wù)邏輯的 JSP 頁(yè)面,而是送給這個(gè)控制器,再由控制器根據(jù)具體的請(qǐng)求調(diào)用不同的事務(wù)邏輯,并將處理結(jié)果返回到合適的頁(yè)面。因此,這個(gè) servlet 控制器為應(yīng)用程序提供了一個(gè)進(jìn)行前 - 后端處理的中樞。一方面為輸入數(shù)據(jù)的驗(yàn)證、身份認(rèn)證、日志及實(shí)現(xiàn)國(guó)際化編程提供了一個(gè)合適的切入點(diǎn);另一方面也提供了將業(yè)務(wù)邏輯從 JSP 文件剝離的可能。業(yè)務(wù)邏輯從 JSP 頁(yè)面分離后, JSP 文件蛻變成一個(gè)單純完成顯示任務(wù)的東西,這就是常說(shuō)的 View 。而獨(dú)立出來(lái)的事務(wù)邏輯變成人們常說(shuō)的 Model, 再加上控制器 Control 本身,就構(gòu)成了 MVC 模式。實(shí)踐證明, MVC 模式為大型程序的開(kāi)發(fā)及維護(hù)提供了巨大的便利。 ?
其實(shí), MVC 開(kāi)始并不是為 Web 應(yīng)用程序提出的模式,傳統(tǒng)的 MVC 要求 M 將其狀態(tài)變化通報(bào)給 V ,但由于 Web 瀏覽器工作在典型的拉模式而非推模式,很難做到這一點(diǎn)。因此有些人又將用于 Web 應(yīng)用的 MVC 稱(chēng)之為 MVC2 。正如上面所提到的 MVC 是一種模式,當(dāng)然可以有各種不同的具體實(shí)現(xiàn),包括您自己就可以實(shí)現(xiàn)一個(gè)體現(xiàn) MVC 思想的程序框架, Struts 就是一種具體實(shí)現(xiàn) MVC2 的程序框架。它的大致結(jié)構(gòu)如圖三所示
?
?
圖基本勾勒出了一個(gè)基于
Struts
的應(yīng)用程序的結(jié)構(gòu),從左到右,分別是其表示層(
view
)、控制層
(controller)
、和模型層
(Model)
。其表示層使用
Struts
標(biāo)簽庫(kù)構(gòu)建。來(lái)自客戶(hù)的所有需要通過(guò)框架的請(qǐng)求統(tǒng)一由叫
ActionServlet
的
servlet
接收(
ActionServlet?Struts
已經(jīng)為我們寫(xiě)好了,只要您應(yīng)用沒(méi)有什么特別的要求,它基本上都能滿(mǎn)足您的要求),根據(jù)接收的請(qǐng)求參數(shù)和
Struts
配置
(struts-config.xml)
中
ActionMapping
,將請(qǐng)求送給合適的
Action
去處理,解決由誰(shuí)做的問(wèn)題,它們共同構(gòu)成
Struts
的控制器。
Action
則是
Struts
應(yīng)用中真正干活的組件,開(kāi)發(fā)人員一般都要在這里耗費(fèi)大量的時(shí)間,它解決的是做什么的問(wèn)題,它通過(guò)調(diào)用需要的業(yè)務(wù)組件(模型)來(lái)完成應(yīng)用的業(yè)務(wù),業(yè)務(wù)組件解決的是如何做的問(wèn)題,并將執(zhí)行的結(jié)果返回一個(gè)代表所需的描繪響應(yīng)的
JSP
(或
Action
)的
ActionForward
對(duì)象給
ActionServlet
以將響應(yīng)呈現(xiàn)給客戶(hù)。
?
過(guò)程如圖所示:
?
?
這里要特別說(shuō)明一下的是:就是 Action 這個(gè)類(lèi),上面已經(jīng)說(shuō)到了它是 Struts 中真正干活的地方,也是值得我們高度關(guān)注的地方。 將業(yè)務(wù)對(duì)象從 Action 分離出來(lái)后有利于它的重用,同時(shí)也增強(qiáng)了應(yīng)用程序的健壯性和設(shè)計(jì)的靈活性。因此,它實(shí)際上可以看作是 Controller 與 Model 的適配器,如果硬要把它歸于那一部分,筆者更傾向于后一種看法,即它是 Controller 的一部分,換句話(huà)說(shuō),它不應(yīng)該包含過(guò)多的業(yè)務(wù)邏輯,而應(yīng)該只是簡(jiǎn)單地收集業(yè)務(wù)方法所需要的數(shù)據(jù)并傳遞給業(yè)務(wù)對(duì)象。
上面這樣簡(jiǎn)單的描述,初學(xué)者可能會(huì)感到有些難以接受,下面舉個(gè)比較具體的例子來(lái)進(jìn)一步幫助我們理解。如:假設(shè),我們做的是個(gè)電子商務(wù)程序,現(xiàn)在程序要完成的操作任務(wù)是提交定單并返回定單號(hào)給客戶(hù),這就是關(guān)于做什么的問(wèn)題,應(yīng)該由 Action 類(lèi)完成,但具體怎么獲得數(shù)據(jù)庫(kù)連接,插入定單數(shù)據(jù)到數(shù)據(jù)庫(kù)表中,又怎么從數(shù)據(jù)庫(kù)表中取得這個(gè)定單號(hào)(一般是自增數(shù)據(jù)列的數(shù)據(jù)),這一系列復(fù)雜的問(wèn)題,這都是解決怎么做的問(wèn)題,則應(yīng)該由一個(gè)(假設(shè)名為 orderBo )業(yè)務(wù)對(duì)象即 Model 來(lái)完成。 orderBo 可能用一個(gè)返回整型值的名為 submitOrder 的方法來(lái)做這件事, Action 則是先校驗(yàn)定單數(shù)據(jù)是否正確,以免常說(shuō)的垃圾進(jìn)垃圾出;如果正確則簡(jiǎn)單地調(diào)用 orderBo 的 submitOrder 方法來(lái)得到定單號(hào);它還要處理在調(diào)用過(guò)程中可能出現(xiàn)任何錯(cuò)誤;最后根據(jù)不同的情況返回不同的結(jié)果給客戶(hù)。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
