struts2工作原理

雖然struts2已經有點過時了,但是企業的舊項目中依然在大量使用,理解struts2其實就是理解struts2的工作原理,很多初學者會迴避下邊這張圖,裏邊確實有很多陌生的單詞,但實際開發中看不懂的部分其實也不用開發人員管,框架早爲我們做了處理。好久沒用struts2了,複習一下,也希望可以幫到部分初學者:



1.從最頂端開始,客戶端發來一個請求HttpServletRequest;

2.請求最先進入一系列的過濾器filter(注意:不是一步直接到ActionMapper),然後進入核心控制器FilterDispatcher,FilterDispatcher判斷請求是否符合web.xml中配置的格式,如下圖:

(本圖爲所有請求),

3.如果符合則進入ActionMapper,ActionMapper決定該請求是否需要調用某個action;

4.如果需要,FilterDispatcher把請求交給代理對象ActionProxy;

5.ActionProxy通過Configuration Manager詢問框架的配置文件struts.xml,找到需要調用的Action類;

6.ActionProxy創建一個ActionInvocation實例,用來調用action,但是在調用之前要先執行攔截器,而默認的攔截器就在struts-default.xml文件裏,struts.xml文件的package又默認繼承struts-default.xml,如圖:


從圖中可以看出,Interceptor的定義和使用的最大範圍是package,這就類似於類,變量和方法的定義和使用必須在類裏;

7.struts2的執行是基於攔截器的,每個struts2請求在進入action之前都要經過默認攔截器和用戶自定義的攔截器(如果用戶不配置攔截器則使用默認攔截器),如果不經過默認攔截器則請求的參數無法到達action,如果用戶自己配置了攔截器,在自定義攔截器之後一定要執行默認攔截器,因爲用戶配置了攔截器之後默認攔截器就會失效,必須手動添加,如圖:

如果把默認攔截器註釋掉只保留用戶配置的攔截器,則相關參數無法到達action,比如文件上傳中的文件,文件名,文件類型等,類似於重定向;

ActionInvocation裏有invoke()方法,該方法會調用攔截器Interceptor中的intercept(ActionInvocation ai)方法,intercept()方法是攔截器的核心方法,方法體內又會調用ai.invoke()方法,直到最後一個攔截器調用之後才進入action,如圖:

action執行之後帶着返回結果又繼續執行intercept()方法的剩餘部分,可以在這兒對返回結果做進一步處理;這就是爲什麼會先執行Interceptor1,2,3再執行Action,帶着返回結果找到result,然後還會執行Interceptor3,2,1的原因;

8.將響應HttpServletResponse返回客戶端,請求結束。


struts2教程

發佈了51 篇原創文章 · 獲贊 80 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章