通過上一章我們明白我們要學(xué)習(xí)的知識點和目標(biāo)。所以這章我將從使用者來講struts2的機制原理。我們都清楚的知道struts2的核心思想是MVC思想六荒。MVC全名是Model View Controller阅懦,是模型(model)-視圖(view)-控制器(controller)的縮寫。說到MVC思想我就不得不講到另一個可能讓人迷糊的知識點(三層架構(gòu))贫母。有多很面試官會問:MVC和三層架構(gòu)是不是同一個東西。如果不是他們又別分是什么盒刚。我們來看一下下面的定義腺劣。
三層架構(gòu)的定義
1.表現(xiàn)層:項目的界面UI相關(guān)的邏輯代碼。你可以理解為Web界面因块。Winform等等都可以說為表現(xiàn)層橘原。
2.業(yè)務(wù)層:項目相關(guān)業(yè)務(wù)邏輯代碼。例如下單業(yè)務(wù)涡上。我們最后一定要計算總的消費金額類似的邏輯趾断。而計算這一步就是屬于業(yè)務(wù)層的。當(dāng)界面用戶看到的數(shù)字就是表現(xiàn)層的吩愧。
3.數(shù)據(jù)層:根據(jù)數(shù)據(jù)庫相關(guān)的邏輯代碼芋酌。不管是什么樣子的項目一般多要對數(shù)據(jù)進行增刪改查的操作。這些代碼都是屬于數(shù)據(jù)層的雁佳。
MVC思想的定義
1.模型(model):你可以理解為業(yè)務(wù)相關(guān)的數(shù)據(jù)代碼脐帝。筆者當(dāng)年把模型對象和這邊的模型相混在一起。這邊的模型是大業(yè)務(wù)來講甘穿。而模型對象只是某一個業(yè)務(wù)完成之后的數(shù)據(jù)存放而以腮恩。
2.視圖(view):界面UI相關(guān)的顯示代碼。
3.控制器(controller):用于處理業(yè)務(wù)相關(guān)的交互代碼温兼。你可以理解為從視圖或從用戶那直接讀取數(shù)據(jù)秸滴,控制用戶輸入的數(shù)據(jù),向模型(model)發(fā)送數(shù)據(jù)募判。
從上面的定義來看的話荡含,我相信還是有很多朋友會看不懂咒唆。筆者當(dāng)年也為這些概念的東西思考了很久。也問我很多人释液,找了很多資料全释。可是還是有會有一點亂误债。來看一張圖片浸船。如下。
這張圖是筆者自己的畫的寝蹈。不好看是必然李命。這不是重點。筆者想要講的是MVC和三層之間的關(guān)系箫老。從圖片上我們就可以看到三層和MVC不是同一東西封字。其中視圖(view)-控制器(controller)在筆者看來只是把表現(xiàn)層上面的代碼更加的細節(jié)化,變得更加有組織耍鬓。而模型(model)只是把業(yè)務(wù)層和數(shù)據(jù)層包在里面而以阔籽。而模型(model),視圖(view)牲蜀,控制器(controller)之間的數(shù)據(jù)交流用模型對象來實現(xiàn)笆制。這邊的模型對象就是代碼常常看到的Model類對象各薇。圖片上有倆個1紅色圓形標(biāo)志项贺。就是筆者認(rèn)為控制器(controller)可以從視圖或從用戶那直接讀取數(shù)據(jù)。
小總結(jié):
我們可以理解為三層和MVC對代碼組織的方式不一樣子峭判。三層用的是UI顯示相關(guān)的代碼,業(yè)務(wù)相關(guān)代碼棕叫,數(shù)據(jù)庫相關(guān)代碼的方式進行劃分林螃。而MVC用的是業(yè)務(wù)邏輯,數(shù)據(jù)(這里筆指的是模型對象)俺泣,界面UI顯示分離的方式來進行化劃分疗认。所以筆者認(rèn)為他們的思想不沖突。硬要說的話伏钠,筆者認(rèn)為MVC是二層,表現(xiàn)層和業(yè)務(wù)邏輯層(其中包含上的業(yè)務(wù)層和數(shù)據(jù)層)横漏。在筆者看來只要把MVC+三層的思想引入任何一個項目的話,都會讓這個項目整體結(jié)構(gòu)上變得更新的清楚熟掂。這里講一個搞笑的事情缎浇。記得當(dāng)年我是這樣子認(rèn)為業(yè)務(wù)層就是一個dll或JAR,而數(shù)據(jù)層也是一個dll或JAR。而表現(xiàn)層就是應(yīng)用的主要項目赴肚。比如 exe應(yīng)用或是aspx/jsp應(yīng)用素跺。然后表現(xiàn)層應(yīng)用引入業(yè)務(wù)層DLL 二蓝,業(yè)務(wù)層項目引用數(shù)據(jù)層DLL。沒有別的意義了指厌。呵呵呵刊愚。
struts2 的機制原理
不管是什么樣子的文檔說明。如果能有一個類似于流程圖的圖片來說明相關(guān)的業(yè)務(wù)細節(jié)的話踩验。那真是太完美了鸥诽。對筆者而來言,現(xiàn)在是復(fù)習(xí)struts2箕憾。所以有一張能說明struts2機制的圖片的話牡借,我只能說事半功陪。我找了很多張圖片厕九。而如下圖片在筆者看來是最好的蓖捶。
請把目光移到上面這張圖片的底部。相信在看這張圖片的時候扁远,很多人會不明白這張圖片要說明什么俊鱼。主要原因筆者認(rèn)為:一是對struts2的基本知識不是很了解;二是沒有認(rèn)真的看這張圖片畅买,只會看圖片的上面部分并闲,沒有看底部的定義。我們來看一下底部是在說明什么谷羞。
橙黃色(Servlet Filters):struts2的過濾器帝火。
藍色(Struts core):表示struts2核心部分的知識點。
綠色(Interceptors):表示攔截器湃缎。如果不清楚攔截器的朋友犀填。你們可以去看一下AOP思想。當(dāng)然Spring在這方面做的非常棒了嗓违。
黃色(User Created):用于說明這部分是開發(fā)人員自己定義的部分九巡。即是所為的開發(fā)代碼。
其實圖片上面應(yīng)該還有一個定義:淡黑色蹂季,如HttpServletRespose和HttpServletRequest冕广。用于表示 用戶的一次請求。
好了偿洁∪龊海看了上面的定義之后,筆者就可以來講解struts2的機制了涕滋。
1.每一次請求(HttpServletRequest)都會通過上面圖片中的橙黃色(Servlet Filters)部分睬辐。即是struts2的過濾器。
2.當(dāng)請求到FliterDispatcher的時候,它會去調(diào)用ActionProxy溉委,ActionProxy會去判斷是否調(diào)用過ConfigurationManager并加載過struts.xml鹃唯。如果沒有就調(diào)用ConfigurationManager并加載struts.xml,在跳入第三步瓣喊。否則如果有就直接跳入第三步坡慌。
3.ActionProxy通過ActionInvocation來執(zhí)行用戶請求對應(yīng)Acion的攔截器。
4.找到對應(yīng)的Acion并執(zhí)行對應(yīng)的方法藻三。
5.根據(jù)Acion執(zhí)行的結(jié)果開始組裝回返的結(jié)果信息洪橘。
6.把對應(yīng)的結(jié)果信息放入HttpServletRespose并回返給用戶顯示出來。
上面值的注意是Filter過濾器和攔截器棵帽。他們會先執(zhí)行上部分熄求,然后去執(zhí)行對應(yīng)的Action,最后在去執(zhí)行下部分逗概。其中ActionProxy弟晚,ConfigurationManager,F(xiàn)literDispatcher等等這里有逾苫,并不代表源碼里面就有卿城。可能會換個名字铅搓。這里更多的是用于表示一種機制概念而以瑟押。