? ? ? ? 筆者根據(jù)自己對(duì)java Web開發(fā)的一些理解坐搔,嘗試基于JavaWeb通俗地解釋什么是MVC模型杭煎,希望能讓編程初學(xué)者更好地理解MVC編程模式纽哥,對(duì)編程初學(xué)者能有所幫助。有說得不對(duì)或不準(zhǔn)確的地方代箭,還望各路大神批評(píng)指正墩划。
? ? ? ? 首先,百度百科一段嗡综,M是指業(yè)務(wù)模型乙帮,V是指用戶界面,C則是控制器极景,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離察净,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。
? ? ? ? 是不是看得一頭霧水戴陡?我說說我的理解塞绿。
? ? ? ? ?V(view),視圖恤批,指的是我們用戶可以直接看到的界面异吻,例如,我們?cè)L問一個(gè)網(wǎng)頁WWW.***.com喜庞,我們能從瀏覽器看到的頁面就是一個(gè)視圖View诀浪,也就是網(wǎng)頁頁面,而常見的網(wǎng)頁頁面文件有HTML文件和jsp文件延都。
? ? ? ? ?C(controller)雷猪,控制器,也叫action晰房,實(shí)質(zhì)上是Java文件里的一個(gè)方法(或叫函數(shù))求摇,這個(gè)方法是用來響應(yīng)瀏覽器的請(qǐng)求的。而每個(gè)Java文件里一般會(huì)有多個(gè)這樣的方法(函數(shù))殊者,每個(gè)方法都會(huì)響應(yīng)不同的瀏覽器請(qǐng)求与境,寫滿這些方法的Java文件,最后會(huì)統(tǒng)一放在一個(gè)文件夾(或叫包)里面猖吴,形成一個(gè)action工廠摔刁。好像還不太懂?舉個(gè)例子海蔽,上面說到了工廠共屈,那就舉個(gè)工廠的例子绑谣,一個(gè)工廠,下面有很多個(gè)部門拗引,每個(gè)部門借宵,就相當(dāng)于一個(gè)java文件,每個(gè)部門下面有很多工人寺擂,就相當(dāng)于一個(gè)java文件里面有好多個(gè)方法(函數(shù))暇务,這些工人干什么吃的?嗯怔软,當(dāng)然要響應(yīng)工廠老板的請(qǐng)求垦细。
? ? ? ? 那這個(gè)工廠老板是誰呢?自然是想要訪問某個(gè)網(wǎng)頁挡逼、或者在網(wǎng)頁上進(jìn)行某項(xiàng)操作的用戶括改,或者說瀏覽器,其實(shí)一個(gè)意思家坎,因?yàn)橛脩舻牟僮魇窃跒g覽器上進(jìn)行的嘱能,需要通過瀏覽器(對(duì)應(yīng)上述的頁面、視圖)向action工廠提交請(qǐng)求虱疏。比方說惹骂,用戶在瀏覽器上輸入了網(wǎng)址www.***.com,服務(wù)器會(huì)把這個(gè)網(wǎng)址解析成一個(gè)action方法的路徑(也就是具體定位到某個(gè)工人)做瞪,等等对粪,好像不太對(duì)?上面不是說從瀏覽器看到的是一個(gè)視圖嗎装蓬?那這個(gè)網(wǎng)址對(duì)應(yīng)的不應(yīng)該是視圖(頁面)的地址著拭?嗯,沒毛病牍帚,你網(wǎng)址確實(shí)是解析成action方法的路徑儡遮,然后,這個(gè)方法暗赶,它會(huì)想辦法找到視圖需要的各種數(shù)據(jù)鄙币,然后把這些數(shù)據(jù)扔到一個(gè)視圖里面,再把帶數(shù)據(jù)的視圖丟回瀏覽器展示給用戶蹂随。
? ? ? ? 舉個(gè)例子爱榔,現(xiàn)在有一個(gè)視圖(界面),叫個(gè)人信息糙及,而個(gè)人信息每個(gè)人是不一樣的,因此筛欢,視圖只保留每個(gè)人共有的部分浸锨,也就是模板唇聘,現(xiàn)在老板想看到張三的個(gè)人信息,就會(huì)在瀏覽器提交請(qǐng)求柱搜,這個(gè)請(qǐng)求定位到了工人A迟郎,工人A去把張三的個(gè)人信息全都拿出來了,扔到了視圖里聪蘸,然后把視圖和數(shù)據(jù)一起丟回瀏覽器展示給老板看宪肖。
? ? ? ?嗯,這就是action的工作健爬。
? ? ? ?那M(Model)又是啥玩意呢控乾?model層(又叫數(shù)據(jù)層或service層),是專門與數(shù)據(jù)庫打交道娜遵,為action工廠提供服務(wù)的工具蜕衡。再用上面工廠的例子,有一天设拟,老板想要看2016年每個(gè)季度的銷售額是多少慨仿,然后請(qǐng)求提交給了工人A,工人A加班了2天纳胧,統(tǒng)計(jì)出來給老板看镰吆。
? ? ? ?然后,老板突然又想看看2016年每個(gè)季度銷售額分別比2015年多多少跑慕,這個(gè)請(qǐng)求提交給了工人B万皿,工人B先加班兩天,把2016年每個(gè)季度銷售額統(tǒng)計(jì)出來相赁,然后再加班兩天相寇,把2015年銷售額統(tǒng)計(jì)出來,再作對(duì)比統(tǒng)計(jì)給老板看钮科。
? ? ? ?又有一天唤衫,老板想根據(jù)2016年各個(gè)季度銷售額,預(yù)測(cè)2017年每個(gè)銷售額是多少绵脯,這個(gè)請(qǐng)求提交給工人C佳励,工人C先加班兩天,把2016年每個(gè)季度銷售額統(tǒng)計(jì)出來蛆挫,然后再加班兩天赃承,把2017年銷售額預(yù)測(cè)出來交給老板看。
? ? ? ? 后來某一天悴侵,這三個(gè)工人坐在一起聊天瞧剖,發(fā)現(xiàn),怎么我們做了那么多重復(fù)的工作呢,于是抓于,他們決定請(qǐng)來一群奴隸做粤,為他們服務(wù),把這些冗余重復(fù)的工作都丟給這群奴隸捉撮,這些奴隸怕品,把各種與數(shù)據(jù)打交道的工作都做好了,工人再接收到老板請(qǐng)求時(shí)巾遭,不需要自己再進(jìn)行統(tǒng)計(jì)肉康,而是直接問奴隸拿這些數(shù)據(jù),工人不再需要關(guān)心這些數(shù)據(jù)是怎么來的灼舍,需要什么吼和,問奴隸要。
? ? ? ? 回到開發(fā)層面片仿,比如現(xiàn)在有兩個(gè)頁面纹安,兩個(gè)頁面都需要同一組數(shù)據(jù):該門課程所有章節(jié)。因?yàn)椴煌撁妫ㄒ晥D)對(duì)應(yīng)的是兩個(gè)不同的action方法砂豌,如果把獲取該門課程所有章節(jié)代碼寫在action方法里厢岂,那這兩個(gè)方法就會(huì)重復(fù)寫這部分代碼,為了避免代碼冗余阳距,model(或叫service)橫空出世塔粒,這個(gè)層面匯集了所有涉及到數(shù)據(jù)增刪改查的代碼,action方法只負(fù)責(zé)響應(yīng)頁面請(qǐng)求和返回?cái)?shù)據(jù)筐摘,數(shù)據(jù)怎么來卒茬?它不管,直接找service要去咖熟。
? ? ? ? ?嗯圃酵,這就是著名的MVC模型,MVC模型馍管,說白了就是一套定義如何進(jìn)行分工協(xié)作的思想郭赐。在過去的開發(fā)過程中,由于沒有很好地進(jìn)行定義分工确沸,會(huì)導(dǎo)致大量的代碼冗余捌锭。因此一群大牛坐下來討論開會(huì),討論出了一種可以大大提高開發(fā)效率和較少代碼冗余的分工思想罗捎,并命名為MVC模型观谦。其中,V就負(fù)責(zé)定義視圖模板桨菜,C就負(fù)責(zé)接收請(qǐng)求并找M拿數(shù)據(jù)然后放到V再丟回瀏覽器豁状;M就負(fù)責(zé)與數(shù)據(jù)打交道捉偏,定義了各種增刪改查的方法。
? ? ? ? 還不懂替蔬?出門右轉(zhuǎn)擼代碼去告私,邊擼邊理解