【Struts2】02 過程分析
阿新 • • 發佈:2020-08-29
首先是訪問了這個地址:
http://localhost:8080/hello.action
請求訪問的第一個資源是工程設定的過濾器:
<filter> <filter-name>Struts2-Filter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2-Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
過濾器在伺服器啟動時建立,而Servlet預設是在被首次訪問的時候建立
過濾器的執行過程:
1、獲取到請求路徑
2、得到請求的URL配置的名稱:hello.action
3、找到並讀取src目錄下的struts.xml配置檔案
4、讀取使用DOM4J進行解析
5、得到的URL名稱值與XML解析的action標籤中的name屬性進行匹配
6、匹配成功,找到action標籤中的class屬性的值,即是訪問的資源類
7、找到HelloAction訪問類的預設方法execute【使用反射實現】
// 通過action標籤配置的class屬性得到這個類 Class<?> HelloActionClass = Class.forName("cn.dzz.action.HelloAction"); // 預設獲取execute方法物件 Method executeMethod = HelloActionClass.getDeclaredMethod("execute"); // 呼叫方法 Object invoke = executeMethod.invoke(HelloActionClass.newInstance());// 我們的方法返回了字串OK ,判斷結果,如果是字串則得到這個字串OK if (invoke instanceof String) { String urlMapping = invoke.toString(); }
8、通過urlMapping與這個action標籤的result標籤的name進行匹配,讀取標籤的值,就是要訪問的資源頁面
原始碼分析:
org\apache\struts2\dispatcher\ng\filter\StrutsPrepareAndExecuteFilter.class
Struts2的這個過濾器,通過重寫init方法,載入Struts2的配置檔案,初始化攔截器的配置資訊
同時包含我們自己編寫的配置檔案
初始化分發器:
下面又有一個空參的初始化方法
init.initDispatcher(config);
按照順序載入了這些配置檔案:
所在類:
org.apache.struts2.dispatcher.Dispatcher
其中第三個配置方法,可以看到這個:
也就是我們自己配置的struts.xml