原文出處:
1.1 struts2請求處理
1. 乙個請求在struts2框架中的處理步驟:
a) 客戶端初始化乙個指向servlet容器的請求;
b) 根據web.xml配置,請求首先經過actioncontextcleanup過濾器,其為可選過濾器,這個過濾器對於struts2和其他框架的整合很有幫助(sitemesh plugin),主要清理當前執行緒的actioncontext和dispatcher;
c) 請求經過外掛程式過濾器,如:sitemesh、etc等過濾器;
g) actionproxy物件建立時,會同時建立乙個actioninvocation的例項;
h) actioninvocation例項使用命名模式來呼叫,在呼叫action的過程前後,涉及到相關***(intercepter)的呼叫;
i) 一旦action執行完畢,actioninvocation例項負責根據struts.xml中的配置建立並返回result。result通常是乙個需要被表示的jsp或者freemarker的模版,也可能是另外的乙個action鏈;
j) 如果要在返回result之前做些什麼,可以實現preresultlistener介面,preresultlistener可以在interceptor中實現,也可以在action中實現;
2. struts2請求處理示意圖:
1.2 struts2請求處理原始碼分析
當使用者向struts2傳送請求時,filterdispatcher的dofilter()方法自動呼叫,dofilter()方法處理請求過程,如下:
1. 建立值棧物件stack;
2. 建立action上下文物件;
3. 對請求進行重新封裝,此次封裝根據請求內容的型別不同,返回不同的物件:
以上**,活**如下:
如果請求以/struts開頭,會自動查詢在web.xml檔案中配置的packages初始化引數,filterdispatcher會將packages引數值包下的檔案當作靜態資源處理,即直接在頁面上顯示檔案內容。
如果使用者請求的資源不是以/struts開頭—可能是.jsp檔案,也可能是.html檔案,則通過過濾器鏈繼續往下傳送,直到到達請求的資源為止。
以上**,活**如下:
c) 載入並解析struts2配置檔案,如果沒有人為配置,預設按順序載入struts-default.xml、struts-plugin.xml、struts.xml,將action配置、result配置、interceptor配置,解析並存入至config物件中,返回檔案配置物件config;
d) 根據執行上下文map、action命名空間、name屬性、method屬性等建立使用者action的**物件;
e) 執行action**物件proxy.execute()方法,並轉向結果;
8. 執行action**物件proxy.execute()方法,該方法的執行,其實就是呼叫了invocation.invoke()方法,如下圖所示:
9. 執行invocation.invoke()方法,實現了截攔器的遞迴呼叫和執行action的execute()方法,defaultactioninvocation.invoke()方法中**,如下圖所示:
在以上**中,並未看出***的遞迴呼叫,其實是否遞迴呼叫,是由程式設計師來控制的,遞迴呼叫實現很簡單:
a) 首先看下interceptor介面定義:
b) 所有的截攔器必須實現intercept方法,而該方法的引數恰恰又是actioninvocation,所以如果在intercept方法中呼叫invocation.invoke(),則會繼續從action的intercepor列表中找到下乙個截攔器執行,依此遞迴呼叫intercepor;
struts2中的日誌***logginginterceptor,如下圖所示:
c) ***遞迴呼叫活**,如下所示:
10. 在invocation.invoke()方法中,執行***、action並獲得resultcode完畢後,則會繼續執行preresultlistener集合,並生成result物件,實現preresultlistener介面,可在返回result之前,做些自定義處理,如圖所示
在返回result之前,通過preresultlistener實現自定義處理,常用的有兩種方式:一種在interceptor中實現,一種在action實現,如圖所示:
以上兩種方式,大家可以發現都是通過匿名內部類的方式實現,其實還有一種方式就是通過在***中實現preresultlistener介面,並實現方法beforeresult方法,即可。如下圖所示:
11. 最後,通過生成result完成使用者響應;
Struts2請求處理流程
1.1 struts2請求處理 1.乙個請求在struts2框架中的處理步驟 a 客戶端初始化乙個指向servlet容器的請求 b 根據web.xml配置,請求首先經過actioncontextcleanup過濾器,其為可選過濾器,這個過濾器對於struts2和其他框架的整合很有幫助 sitemes...
Struts2請求流程
1 客戶端傳送請求 2 請求先通過actioncontextcleanup filterdispatcher 6 actionproxy建立乙個actioninvocation的例項 7 actioninvocation呼叫真正的action,當然這涉及到相關 的呼叫 8 action執行完畢,ac...
Struts2請求處理流程及原始碼分析
1.乙個請求在struts2框架中的處理步驟 a 客戶端初始化乙個指向servlet容器的請求 b 根據web.xml配置,請求首先經過actioncontextcleanup過濾器,其為可選過濾器,這個過濾器對於struts2和其他框架的整合 很有幫助 sitemesh plugin 主要清理當前...