Struts2請求處理流程及原始碼分析

2021-09-06 05:58:34 字數 3058 閱讀 6033

原文出處:

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 主要清理當前...