轉載文章 https://blog.csdn.net/qq_32166627/article/details/70050012
Struts2是一個相對流行的MVC框架。在說Struts2之前,我們先回顧一下傳統的servlet/jsp實現的MVC架構,其運行機制是:jsp頁面(視圖view)發送消息到servlet(控制器Controller),servlet獲取請求數據,處理業務邏輯,分發轉向。這樣的話,servlet就太臃腫了,什麼活兒都是servlet在幹,而且業務邏輯全是硬編碼,代碼都寫死了不利於維護。
Struts2框架的MVC分別對應:
V:jsp+OGNL
C:action類
M:javabean+ModelDriven
Struts2框架的控制器將“獲取請求”和“分發轉向”代碼抽取出來寫在配置文件裏,這樣一來,控制器(action類)就能專注於業務邏輯的處理了。
正文
1,一個完整的Struts2項目的web目錄結構及主要文件的執行流程
各文件執行流程關係
由上圖可以看出,Struts2的MVC各個部分都是圍繞着struts.xml文件執行的,這樣就解放了控制器的負擔,而且解決了硬編碼的問題。
2,Struts2框架的內部執行過程
上面講了MVC中個文件的執行過程,那只是一小部分,現在來看一下整個struts2框架的執行機制,下面的圖來源於官網,然後加了自己的改動。
由上圖看出,整個框架的運行又緊緊圍繞着核心過濾器StrutsPrepareAndExecuteFilter展開工作。深入到filter的源碼中會對理解有所幫助。下面幾篇博客對filter的介紹很好。
(1),struts2請求過程源碼分析:博客1
(2),Struts 2配置文件加載順序:博客2
3,默認攔截器
struts-default.xml配置文件中定義了一個默認攔截器棧,這些攔截器就是動作方法執行之前的要執行的。常用的有封裝用戶表單數據到javabean的modelDriven攔截器,用於輸入驗證的validation攔截器,等等。
4,View和Controller之間的交互
從視圖頁面每次發來的用戶請求都會產生一些數據,這些數據都存放在哪兒呢?實際上,每次動作類執行前,核心過濾器StrutsPrepareAndExecuteFilter都會創建2個對象:ActionContext和ValueStack,這2個對象存儲了動作訪問期間用到的所有數據。這些數據又可以在jsp頁面上通過strut標籤和OGNL表達式來取得。
(1),ActionContext是一個map數據結構,其中的key是一些常見的域對象(application,session,request等),而value又是一個map。也就是說ActionContext是一個大map包裹着一些小map。
(2),ValueStack是一個ArrayList數據結構,並且是一個棧結構,每次都在棧頂存取數據。
5,Controller與Model之間的交互
C和M之間的交互比較簡單,利用Struts框架提供的攔截器:ModelDriven,即可實現將用戶表單提交的數據封裝到對應的javabean中。要點:(1)javabean類自己編寫。(2)動作類要實現ModelDriven接口。(3)實現抽象方法getModel()。
總結
本文從宏觀角度解讀了Struts2框架的基本結構,每個部分的具體細節以後再講。
---------------------
作者:name_s_Jimmy
來源:CSDN
原文:https://blog.csdn.net/qq_32166627/article/details/70050012
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!