MVC簡介

MVC簡介

面試的時候被問到關(guān)于MVC相關(guān)的知識,才發(fā)現(xiàn)自己只會說出來什么叫MVC,但是其詳細(xì)的東西自己卻無法順利的表述出來,特在此記錄下。

MVC基礎(chǔ)

MVC是Model-View-Controller的簡稱,是一種軟件架構(gòu)模式,也是經(jīng)過很多人的長期實(shí)踐最后得出來的很適合軟件開發(fā)的一種模式。

M(Model)模型層,這應(yīng)該是最底層的一層,這一層中我們需要處理的是業(yè)務(wù)邏輯和數(shù)據(jù)等等方面的東西,包括核心業(yè)務(wù)代碼的編寫,訪問數(shù)據(jù)庫或者文件進(jìn)行數(shù)據(jù)處理,數(shù)據(jù)庫等很多方面。

V(View)視圖層,這一層是最上面的一層,用戶可以看到并且進(jìn)行操作的地方。

C(Controller)控制層,這部分處于中間,負(fù)責(zé)轉(zhuǎn)發(fā)和處理請求,接收來自視圖層用戶的操作等,負(fù)責(zé)處理和轉(zhuǎn)發(fā);會根據(jù)情況傳遞到模型層,模型層做完處理之后,再由控制層根據(jù)實(shí)際情況返回到視圖層去展示。另外一種情況是在模型層處理完之后,可以直接將結(jié)果返回給視圖層。

Web MVC

Web開發(fā)中的MVC模式跟標(biāo)準(zhǔn)的MVC模式一樣,但是Web MVC不能在模型層將結(jié)果主動推送給視圖層,因?yàn)閃eb模式下是基于請求-響應(yīng)模型的。其他的定義和流程都和標(biāo)準(zhǔn)MVC模式是一樣的。

Web如何進(jìn)化到MVC

這里的Web進(jìn)化主要利用Java開發(fā)方面的歷程作說明,當(dāng)然最開始的CGI不算是Java中的過程,但是還是需要它作為開頭。

大致的歷程為:CGI --> Servlet --> JSP --> Model1 --> Model2

CGI

由于沒有使用過CGI這種技術(shù)做過開發(fā),只能使用維基上的定義來簡單說明下。CGI是通用網(wǎng)關(guān)接口(Common Gateway Interface)的簡稱,多使用Perl語言編寫,接受用戶的請求,然后根據(jù)請求的返回給用戶HTML頁面。但是每次CGI請求都會生成一個新的進(jìn)程去處理,對服務(wù)器來說壓力太大,請求大的時候很快就會垮掉。

Servlet

Servlet技術(shù)和CGI技術(shù)的作用是一樣的,但是Servlet是Java體系中最早用來解決Web的技術(shù)。Java是平臺無關(guān)的,同樣Servlet也是,它比CGI更加的高高效,CGI針對請求生成的是進(jìn)程級別的,而Servlet生成的是線程級別的。

Servlet的生命周期

  1. 加載和實(shí)例化

    Servlet容器負(fù)責(zé)加載和實(shí)例化Servlet。

  2. 初始化

    Servlet在實(shí)例化之后,會調(diào)用init()方法初始化。

  3. 服務(wù)

    Servlet的service()方法對請求進(jìn)行處理。

  4. 銷毀

    Servlet的destory()方法用來銷毀Servlet實(shí)例,釋放資源等。

Servlet缺點(diǎn)

Servlet技術(shù)讓Java有了Web方面的更好的選擇,后來的技術(shù)很大一部分都是在Servlet的基礎(chǔ)上發(fā)展來的。但是Servlet直接做開發(fā)還是顯得很繁瑣,我在使用Servlet做開發(fā)的時候遇到過很多的弊端,直接點(diǎn)說就是Servlet做開發(fā)時,把MVC的分層直接放到一起了,甚至html代碼也得在Servlet里面直接輸出。這樣的做法對于后期維護(hù)修改或者頁面的調(diào)試很是麻煩?,F(xiàn)在直接用Servlet做開發(fā)已經(jīng)很少用了,但是還是得作為必須要去學(xué)習(xí)的基礎(chǔ)知識。

JSP

JSP技術(shù)使用在html頁面中嵌入腳本語言的方式來處理Servlet技術(shù)的不足,相對于Servlet來說有了很多進(jìn)步,開發(fā)頁面更加方便簡單。但是實(shí)質(zhì)上JSP最后還是被編譯成了Servlet,表現(xiàn)邏輯以及控制和模型等方面的邏輯還是混雜在了一起,看起來好像是跟Servlet反過來一樣。這種做法同樣不可取。

Model1

這種技術(shù)是JSP和JavaBean的組合,相對于JSP來說只是將業(yè)務(wù)邏輯放到了單獨(dú)的JavaBean中去,可以理解為是JSP的增強(qiáng),對JSP頁面進(jìn)行了簡化,但是JSP頁面仍然將表現(xiàn)邏輯,控制邏輯,業(yè)務(wù)邏輯等混雜到一起。這種做法仍然不可取。

Model2

Model2采用JSP+Servlet+JavaBean來實(shí)現(xiàn),其實(shí)這時候就可以認(rèn)為是我們的Web MVC模型了,在實(shí)際使用中也是使用的這種模式。

JSP 使用html和jsp的標(biāo)簽來負(fù)責(zé)實(shí)現(xiàn)表現(xiàn)層;Servlet負(fù)責(zé)接收用戶的請求,轉(zhuǎn)交給模型層進(jìn)行處理,返回結(jié)果給視圖層等功能;JavaBean負(fù)責(zé)業(yè)務(wù)邏輯的處理,也就是模型層的功能。

到這里為止,開發(fā)過程中遇到的方式都已經(jīng)介紹完了,也走到了MVC模式這一步。下面會簡單介紹下MVC的框架相關(guān)知識。

Spring Web MVC

先看一下Spring官方的一張請求處理流程圖:



再看一下具體的流程:

  1. 第一步,用戶發(fā)送請求(Incoming request)到前端控制器(Front controller)
  2. 前端控制器(Front controller)根據(jù)實(shí)際的請求信息來決定把請求委托給具體的頁面控制器(Controller)。頁面控制器用來處理實(shí)際的請求內(nèi)容,直接返回或者需要Model層進(jìn)行數(shù)據(jù)處理。
  3. 頁面控制器(Controller)接收到請求后進(jìn)行處理,處理完成后返回model數(shù)據(jù),并委托給前端控制器(Front controller)進(jìn)行渲染。
  4. 前端控制器(Front controller)根據(jù)邏輯視圖名和model數(shù)據(jù)選擇視圖模板(View template)進(jìn)行渲染,渲染完成后返回給前端控制器(Front controller)。
  5. 最后前端控制器將渲染后的最終結(jié)果返回給用戶。

對應(yīng)具體的源碼分析不在此做過多說明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容