Struts2 源碼分析——核心機制


MVC和三層的看法

通過上一章我們明白我們要學習的知識點和目標。所以這章我將從使用者來講struts2的機制原理。我們都清楚的知道struts2的核心思想是MVC思想。MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫。說到MVC思想我就不得不講到另一個可能讓人迷糊的知識點(三層架構)。有多很面試官會問:MVC和三層架構是不是同一個東西。如果不是他們又別分是什么。我們來看一下下面的定義。

三層架構的定義

  1.表現層:項目的界面UI相關的邏輯代碼。你可以理解為Web界面。Winform等等都可以說為表現層。

  2.業務層:項目相關業務邏輯代碼。例如下單業務。我們最后一定要計算總的消費金額類似的邏輯。而計算這一步就是屬於業務層的。當界面用戶看到的數字就是表現層的。

  3.數據層:根據數據庫相關的邏輯代碼。不管是什么樣子的項目一般多要對數據進行增刪改查的操作。這些代碼都是屬於數據層的。

MVC思想的定義

  1.模型(model):你可以理解為業務相關的數據代碼。筆者當年把模型對象和這邊的模型相混在一起。這邊的模型是大業務來講。而模型對象只是某一個業務完成之后的數據存放而以。

  2.視圖(view):界面UI相關的顯示代碼。

  3.控制器(controller):用於處理業務相關的交互代碼。你可以理解為從視圖或從用戶那直接讀取數據,控制用戶輸入的數據,向模型(model)發送數據。

從上面的定義來看的話,我相信還是有很多朋友會看不懂。筆者當年也為這些概念的東西思考了很久。也問我很多人,找了很多資料。可是還是有會有一點亂。來看一張圖片。如下。

這張圖是筆者自己的畫的。不好看是必然。這不是重點。筆者想要講的是MVC和三層之間的關系。從圖片上我們就可以看到三層和MVC不是同一東西。其中視圖(view)-控制器(controller)在筆者看來只是把表現層上面的代碼更加的細節化,變得更加有組織。而模型(model)只是把業務層和數據層包在里面而以。而模型(model),視圖(view),控制器(controller)之間的數據交流用模型對象來實現。這邊的模型對象就是代碼常常看到的Model類對象。圖片上有倆個1紅色圓形標志。就是筆者認為控制器(controller)可以從視圖或從用戶那直接讀取數據。

小總結:

我們可以理解為三層和MVC對代碼組織的方式不一樣子。三層用的是UI顯示相關的代碼,業務相關代碼,數據庫相關代碼的方式進行划分。而MVC用的是業務邏輯,數據(這里筆指的是模型對象),界面UI顯示分離的方式來進行化划分。所以筆者認為他們的思想不沖突。硬要說的話,筆者認為MVC是二層,表現層和業務邏輯層(其中包含上的業務層和數據層)。在筆者看來只要把MVC+三層的思想引入任何一個項目的話,都會讓這個項目整體結構上變得更新的清楚。這里講一個搞笑的事情。記得當年我是這樣子認為業務層就是一個dll或JAR,而數據層也是一個dll或JAR。而表現層就是應用的主要項目。比如 exe應用或是aspx/jsp應用。然后表現層應用引入業務層DLL ,業務層項目引用數據層DLL。沒有別的意義了。呵呵呵。 

struts2 的機制原理

不管是什么樣子的文檔說明。如果能有一個類似於流程圖的圖片來說明相關的業務細節的話。那真是太完美了。對筆者而來言,現在是復習struts2。所以有一張能說明struts2機制的圖片的話,我只能說事半功陪。我找了很多張圖片。而如下圖片在筆者看來是最好的。

請把目光移到上面這張圖片的底部。相信在看這張圖片的時候,很多人會不明白這張圖片要說明什么。主要原因筆者認為:一是對struts2的基本知識不是很了解;二是沒有認真的看這張圖片,只會看圖片的上面部分,沒有看底部的定義。我們來看一下底部是在說明什么。

橙黃色(Servlet Filters):struts2的過濾器。

藍色(Struts core):表示struts2核心部分的知識點。

綠色(Interceptors):表示攔截器。如果不清楚攔截器的朋友。你們可以去看一下AOP思想。當然Spring在這方面做的非常棒了。

黃色(User Created):用於說明這部分是開發人員自己定義的部分。即是所為的開發代碼。

其實圖片上面應該還有一個定義:淡黑色,如HttpServletRespose和HttpServletRequest。用於表示 用戶的一次請求。

好了。看了上面的定義之后,筆者就可以來講解struts2的機制了。

1.每一次請求(HttpServletRequest)都會通過上面圖片中的橙黃色(Servlet Filters)部分。即是struts2的過濾器。

2.當請求到FliterDispatcher的時候,它會去調用ActionProxy,ActionProxy會去判斷是否調用過ConfigurationManager並加載過struts.xml。如果沒有就調用ConfigurationManager並加載struts.xml,在跳入第三步。否則如果有就直接跳入第三步。

3.ActionProxy通過ActionInvocation來執行用戶請求對應Acion的攔截器。

4.找到對應的Acion並執行對應的方法。

5.根據Acion執行的結果開始組裝回返的結果信息。

6.把對應的結果信息放入HttpServletRespose並回返給用戶顯示出來。

上面值的注意是Filter過濾器和攔截器。他們會先執行上部分,然后去執行對應的Action,最后在去執行下部分。其中ActionProxy,ConfigurationManager,FliterDispatcher等等這里有,並不代表源碼里面就有。可能會換個名字。這里更多的是用於表示一種機制概念而以。

文章總結

本章的內容比較概念,目的是為了讓筆者進入源碼的時候,對struts2框架有一個大概的認識。同時也講了相關的三層。而struts2機制更是本章的重點。只有了解了struts2機制之后。看源碼才不會迷失方向。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM