Django——WEB三层架构与MVC
而我發(fā)此文的目的有二:一者,讓初學(xué)者能夠聽(tīng)到一家之言,是為解惑;二者,更希望拋磚引玉,得到專家的批判。
許多學(xué)生經(jīng)常問(wèn)我,MVC到底和WEB三層架構(gòu)有啥關(guān)系? 開(kāi)始時(shí),我也只能給他們一些模糊的回答。時(shí)間長(zhǎng)了,自己的良心開(kāi)始受到譴責(zé)。對(duì)于一個(gè)程序員來(lái)說(shuō),這個(gè)問(wèn)題顯得挺學(xué)究。我在跟自己的許多程序員朋友以及同 行(Java講師)都對(duì)MVC和WEB三層架構(gòu)的關(guān)系做了探討。現(xiàn)在可以說(shuō)對(duì)WEB三層架構(gòu)和MVC之間的關(guān)系理出了頭緒。此可謂教學(xué)相長(zhǎng)。
先說(shuō)說(shuō)Web三層架構(gòu)這個(gè)古老話題。地球人都知道web三層架構(gòu)是指:
- >用戶接口層(UI Layer)
- >業(yè)務(wù)邏輯層(Bussiness Layer)
- >持久化層
?
關(guān)于業(yè)務(wù)邏輯和用戶接口
在早期的web開(kāi)發(fā)中,因?yàn)闃I(yè)務(wù)比較簡(jiǎn)單,并沒(méi)有這三層的劃分。用戶數(shù)據(jù)的呈現(xiàn)及輸入的接收、封裝、驗(yàn)證、處理、以及對(duì)數(shù)據(jù)庫(kù)的操作,都放在jsp 頁(yè)面中。這時(shí)的開(kāi)發(fā),好比盤古尚未開(kāi)天辟地,整個(gè)web開(kāi)發(fā)就是一片“混沌”。隨著業(yè)務(wù)越來(lái)越復(fù)雜,人們開(kāi)始考慮更好的利用OOP這把利刃來(lái)解決問(wèn)題。于 是有人發(fā)現(xiàn)把業(yè)務(wù)邏輯抽取出來(lái)并形成與顯示和持久化無(wú)關(guān)的一層,能夠讓業(yè)務(wù)邏輯清晰,產(chǎn)品更便于維護(hù)。這就是SUN當(dāng)初倡導(dǎo)的JSP Model 1開(kāi)發(fā)方式。
關(guān)于持久化
JSP M1開(kāi)發(fā)方式中,并沒(méi)有對(duì)數(shù)據(jù)如何持久化給出建議。在許多公司中,它們的產(chǎn)品是以數(shù)據(jù)庫(kù)為中心進(jìn)行架構(gòu)和設(shè)計(jì)的。在他們的產(chǎn)品里,雖然也有DAO層,但是 職責(zé)不清。為什么這么說(shuō)呢,因?yàn)槲野l(fā)現(xiàn)在許多人眼里,DAO層的指責(zé)很簡(jiǎn)單——增刪改查。但我認(rèn)為,這樣理解實(shí)際上是本末倒置了。對(duì)于簡(jiǎn)單數(shù)據(jù)的管理來(lái) 說(shuō),這樣理解無(wú)可厚非。但隨著業(yè)務(wù)邏輯變得日益復(fù)雜。我們實(shí)在是被復(fù)雜的對(duì)象關(guān)系搞頭疼了,如果這時(shí)我們還要考慮如何把數(shù)據(jù)存儲(chǔ)起來(lái)(通常的情況下是存到 關(guān)系型數(shù)據(jù)庫(kù)中),我們開(kāi)始抱怨自己軟件的架構(gòu)太惡心,一團(tuán)糟。面向?qū)ο笤O(shè)計(jì)思想教會(huì)我們——如果我們不想做這件事,就交給別人做吧!這時(shí)聰明的架構(gòu)師們 提出了一個(gè)概念——持久化。如果我們?cè)谧约旱膽?yīng)用中添加一個(gè)新的層——專門負(fù)責(zé)對(duì)象狀態(tài)的持久化保存及同步,那不就可以全心全意的“搞對(duì)象”了嗎?持久化 概念的產(chǎn)生,代表著我們對(duì)關(guān)系型數(shù)據(jù)庫(kù)的依賴降低了。因此甚至有人推斷——數(shù)據(jù)庫(kù)已死。同時(shí),關(guān)系型數(shù)據(jù)庫(kù)這個(gè)新的概念也不斷形成,并演化成理論,又由理 論衍生出產(chǎn)品。因此一個(gè)意識(shí)良好的程序員,至少應(yīng)該認(rèn)同,持久化并不是產(chǎn)品中最重要的環(huán)節(jié)——最重要的環(huán)節(jié)是清晰正確的業(yè)務(wù)邏輯。
灰色地帶
是的,從理論上看,web三層架構(gòu)很美了。但在實(shí)際開(kāi)發(fā)產(chǎn)品的時(shí)候,我們發(fā)現(xiàn)了很多問(wèn)題。主要問(wèn)題就是用UI層和業(yè)務(wù)層之間有許多灰色地帶。這些灰色地帶業(yè)務(wù)邏輯層不想管,UI層也不想管。讓我們舉一些例子:
例子1, 難以管理的頁(yè)面跳轉(zhuǎn)關(guān)系
上圖是我在講JSP課程時(shí),一個(gè)簡(jiǎn)單案例的頁(yè)面跳轉(zhuǎn)關(guān)系圖。這是一個(gè)十分簡(jiǎn)單的例子,但頁(yè)面跳轉(zhuǎn)關(guān)系已經(jīng)挺復(fù)雜了。試想,如果你正在做一個(gè)有上百?gòu)?表,十幾個(gè)核心模塊,幾百個(gè)頁(yè)面的產(chǎn)品時(shí),這張圖將變得多么復(fù)雜!而問(wèn)題是,這些頁(yè)面跳轉(zhuǎn)關(guān)系分散在JSP和Servlet中,非常難以管理。
例子2,表單數(shù)據(jù)的驗(yàn)證及封裝:
假設(shè)我們正在做一個(gè)簡(jiǎn)單的表單提交,我們希望對(duì)用戶數(shù)據(jù)的數(shù)據(jù)進(jìn)行驗(yàn)證和封裝,最終交給業(yè)務(wù)邏輯層一個(gè)實(shí)體對(duì)象。從三層架構(gòu)分析,我們想要做的事情是這樣的:
但是該把驗(yàn)證和封裝數(shù)據(jù)的工作交給誰(shuí)來(lái)做呢?UI層還是業(yè)務(wù)邏輯層?都不太合適!
例子3,國(guó)際化:
如果我們想為不同國(guó)家和地區(qū)的人提供不同的語(yǔ)言,無(wú)疑需要國(guó)際化的支持。那么,我們需要在JSP頁(yè)面上根據(jù)用戶的配置或請(qǐng)求信息判斷應(yīng)該為該用戶呈現(xiàn)哪國(guó)文字。而這些判斷和顯示的邏輯應(yīng)該劃分到業(yè)務(wù)邏輯層還是UI層呢?
用MVC的思路解決問(wèn)題
對(duì)于糾纏不清的問(wèn)題,我們總要想辦法將其分解。MVC是一種設(shè)計(jì)思想。這種思想強(qiáng)調(diào)實(shí)現(xiàn)模型(Model)、視圖(View)和控制器的分離。這種思想是如何作用于web的呢?實(shí)際上,我們?cè)趙eb開(kāi)發(fā)中引入MVC思想,想要達(dá)到的目的是: 實(shí)現(xiàn)UI層和業(yè)務(wù)邏輯層分離——控制器是為了實(shí)現(xiàn)上述目的而存在的!
在解決了持久化的問(wèn)題后,我們發(fā)現(xiàn),我們的所說(shuō)的業(yè)務(wù)邏輯層和MVC中的Model指的是一回事,我們所說(shuō)的UI層和MVC中的View是一回事。 MVC提供了讓模型和視圖相分離的思路——引入控制器。我們把頁(yè)面跳轉(zhuǎn)關(guān)系管理、表單數(shù)據(jù)的封裝及驗(yàn)證、國(guó)際化等任務(wù)交給控制器處理。因此,也不難理解為 什么流行的MVC框架都具有管理頁(yè)面跳轉(zhuǎn)關(guān)系、表單數(shù)據(jù)的封裝及驗(yàn)證、國(guó)際化等特性。
總結(jié)
在Java web開(kāi)發(fā)中,MVC框架充當(dāng)了UI層和業(yè)務(wù)邏輯層的適配器的作用。MVC框架實(shí)現(xiàn)了UI層和業(yè)務(wù)邏輯層最大程度的分離。
轉(zhuǎn)載于:https://www.cnblogs.com/Simon-xm/p/3966495.html
總結(jié)
以上是生活随笔為你收集整理的Django——WEB三层架构与MVC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: NSDate根据日期获得当前是周几,以及
- 下一篇: s3c2440移植MQTT