日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2初始化流程及源码分析

發布時間:2023/12/1 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2初始化流程及源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1 Struts2初始化

在講Struts2的初始化之前,應該為大家描述下Web應用中的過濾器Filter,這關系到我們對核心過濾器FilterDispatcher的正確理解。

Filter:一個filter是一個對象,為每個請求資源(一個servlet或靜態內容) ,或響應一個資源,或兩者,用于執行過濾任務。過濾器執行過濾是在doFilter方法中。每個過濾器方法訪問一個FilterConfig對象從中獲取初始化參數,filterConfig.getServletContext()可以獲得ServletContext對象使用。過濾器的配置在Web應用程序的web.xml中。

init():初始化過濾器,它的輸入參數javax.servlet.FilterConfig的一個實例,可以在這里初始化過濾要使用到的FilterConfig。該方法由Web容器自動調用。

doFilter():進行具體的過濾操作,這個方法以javax.servlet.ServletRequest請求信息, javax.servlet.ServletResponse響應信息,javax.servlet.FilterChain過濾鏈。過濾鏈,在Web應用程序中所有的過濾器會構成一個鏈狀,符合過濾條件的程序將會根據定義的順序執行所有鏈中的過濾器。在這個方法中調用FilterChain的 doFilter(javax.servlet.ServletRequest, javax.servlet.SerletResponse)方法就可以傳遞到鏈中的下一個過濾器。

destory():銷毀過濾器,可以在這里釋放使用完的資源,例如設置過濾器中FilterConfig為null。

綜上所述,在Web應用啟動時,會默認初始化Filter,調用Filter的init(FilterConfig filterConfig)方法,當請求到來時,會按順序執行web.xml中所配置Filter的doFilter(ServletRequest req, ServletResponse res, FilterChain chain)方法。

Struts2的核心過濾器FilterDispatcher實現的就是StrutsStatics, Filter接口,所以它本質就是一個過濾器,如下圖所示:

所以Struts2的初始化工作在Web應用啟動時,就可以通過FilterDispatcher核心過濾器init(FilterConfig filterConfig)方法來完成了。如下圖所示:

FilterDispatcher.init(FilterConfig filterConfig)方法中主要工作分為:

a) 創建Dispatcher類對象,將FilterDispatcher配置的初始化參數傳到該對象中;

b) 加載并解析配置文件,配置文件分為屬性配置文件、Bean配置文件兩種。Struts2的配置文件包括系統默認的配置文件: default.properties、struts-default.xml,以及插件配置文件、應用配置文件:struts-plugin.xml、struts.xml、struts.properties、web.xml。那么這六種配置文件的加載順序,如下:

1. default.properties

2. struts-default.xml

3. struts-plugin.xml

4. struts.xml

5. struts.properties

6. web.xml

加載順序如下圖所示:

c) 加載靜態資源配置參數: packages,該參數用來配置自動搜尋目錄;

小提示:

FilterDispatcher 實現的StrutsStatics接口,沒有定義業務方法,只定義了若干個常量。Struts2對常用的接口進行了重新封裝,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。如下圖所示:

1.2 Struts2初始化源碼分析

1. Struts2 Web應用啟動時,根據web.xml配置的核心過濾器FilterDispatcher,會初始化FilterDispatcher:

2. 正如我們知道的,過濾器初始化時,會自動調用init()方法進行初始化工作,所以在FilterDispatcher啟動時,會自動調用init(FilterConfig filterConfig)方法,進行Struts2的初始化,首先在該方法中會創建org.apache.struts2.Dispatcher對象,將FilterDispatcher配置的初始化參數傳到該對象中,然后調用dispatcher.init()方法加載并解析配置文件,最后加載靜態資源配置參數packages。org.apache.struts2.dispatcher.FilterDispatcher.java源碼如下圖所示:

3. 在FilterDispatcher.init()方法中,首先創建Dispatcher類對象,并將FilterDispatcher配置的初始化參數傳到對象中;相關代碼,如下圖所示:

4. 然后通過dispatcher.init()方法,加載并解析Struts2配置文件,配置文件的加載與解析是由Provider類來實現完成的,所以可分為兩步:加載配置Provider、解析配置Provider,具體處理步驟如下:

a) 創建com.opensymphony.xwork2.config.ConfigurationManager,其中屬性List<ContainerProvider> containerProviders存放所有配置Provider。

b) init_DefaultProperties():初始化一個用來加載default.properties的DefaultPropertiesProvider,并存入至containerProviders。

c) init_TraditionalXmlConfigurations():默認根據struts-default.xml,struts-plugin.xml,struts.xml (可根據init-param:config 修改加載路徑) 分別創建三個 org.apache.struts2.config. StrutsXmlConfigurationProvider,并存入至containerProviders。

d) init_LegacyStrutsProperties():初始化初始化一個用來加載struts.properties的LegacyPropertiesConfigurationProvider,并存入至containerProviders。

e) init_CustomConfigurationProviders():根據init-param:configProviders初始化一個用戶自定義實現的ConfigurationProvider接口的Provider,并存入至containerProviders。

f) init_FilterInitParameters():初始化一個用來加載web.xml中initParams配置的ConfigurationProvider, 并存入至containerProviders。

g) init_AliasStandardObjects() :初始化一個用來為所配置的Bean與具體類映射的BeanSelectionProvider,并存入至containerProviders。

h) init_PreloadConfiguration():以上幾步存入ConfigurationProvider對象完畢后,按順序循環調用上面幾步存入的ConfigurationProvider的register、loadPackages、addPackage方法(先加載先解析),進行解析配置Provider。

小提示:

1. 加載配置Provider,其實就是加載配置文件;

2. 解析配置Provider,其實就是解析配置文件;

下面列出以上a-h步的相關代碼,如下圖所示:

1. Struts2中dispatcher.init()代碼:

2. Struts2中init_PreloadConfiguration()方法代碼:

3. XWork中configurationManager.getConfiguration()方法代碼:

4. XWork中configuration.reloadContainer()方法代碼:

5. Xwork中XmlConfigurationProvider.loadPackages()方法代碼:

6. Xwork中XmlConfigurationProvider.addPackage ()方法代碼:

4. 最后通過staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig))加載靜態資源配置參數:packages,值得注意的是,還有另外三個固定的包和該參數進行拼接,分別是org.apache.struts2.static、template、和org.apache.struts2.interceptor.debugging,中間用空格隔開,經過解析將包名變成路徑后存儲到一個名叫pathPrefixes的數組中,這些目錄中的文件會被自動搜尋;相關代碼,如下圖所示:

注:

關于源碼分析,大概分為兩種:流程源碼分析、過程源碼分析,因本人的初衷是流程源碼分析,所以以上的分析是根據初始化處理流程順序來進行分析的,并未對各個方法的過程細節做深入的講解,望見諒。

轉載于:https://www.cnblogs.com/mktao/archive/2012/08/30/2664296.html

總結

以上是生活随笔為你收集整理的Struts2初始化流程及源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。