Struts初始化之ActionServlet

隨着Struts2的推出,不少人認爲原有的Struts1.2已經沒有學習的價值,其實並非這樣,無論怎麼樣,原有的Struts1.2要比現有的Struts2成熟,並且Struts2推出的時間還不是很長,因此,Struts1.2至少在現階段的應用仍是要比Struts2的應用要廣。因此,認真深刻的學習Struts1.2仍是頗有必要的。
首先是Struts1.2的核心類,ActionServlet類。
ActionServlet位於org.apache.struts.action包內,這個類將會在struts第一次使用時,做爲servlet初始化並存入Servlet容器。在初始化時:
首先 調用init()方法,Struts 的初始化實現就是在這裏實現的。在執行init()方法時,會調用initInternal(),初始化內部文件ActionResources.properties,它經過internal = MessageResources.getMessageResources(internalName)獲得內部文件;
調用 initOther(),從web.xml中加載ActionServlet的初始化參數,包括config/ convertNull,其中config默認路徑爲"/WEB-INF/struts-config.xml", protected String config = "/WEB-INF/struts-config.xml",從web.xml中讀取config參數:
String value;
value = getServletConfig().getInitParameter("config");
if (value != null) {
config = value;
}

得到convertNull的值, getServletConfig().getInitParameter("convertNull");
調用 initServlet(),從web.xml中加載ActionServlet的初始化參數如servlet-name,加載DTD文件並把其放入HashMap緩存,讀取並解析web.xml的內容,
getServletConfig().getServletName();
Digester digester = new Digester();
digester.push(this);
// 把當前的 ActionServlet 對象放入到解析堆棧中
調用initServlet(),運行時,digester 就會調用 ActionServlet中的 addServletMapping() 方法,並傳入兩個參數
digester.addCallMethod("web-app/servlet-mapping", "addServletMapping", 2);
digester.addCallParam("web-app/servlet-mapping/servlet-name", 0);
digester.addCallParam("web-app/servlet-mapping/url-pattern", 1);

上面要從web.xml得到的元素值:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>



// 來判斷當前 servlet 名稱是否爲正在運行的 servlet 名稱,如是,就把 url-pattern 做爲 servletMapping
public void addServletMapping(String servletName, String urlPattern) {
if (servletName == null) {
return;
}
if (servletName.equals(this.servletName)) {
if (log.isDebugEnabled()) {
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}
this.servletMapping = urlPattern;
}
}


// 讀取配置文件web.xml的內容
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/web.xml");

// 如找不到/WEB-INF/web.xml文件,則報錯
if (input == null) {
log.error(internal.getMessage("configWebXml"));
throw new ServletException(internal.getMessage("configWebXml"));
}


// 報錯信息定義在org\apache\struts\action\ActionResources.properties中
configWebXml=The /WEB-INF/web.xml was not found.


// 解析input流文件,每讀到一個節點元素就觸發一個事件 digester.parse(input)調用 initChain(),讀取web.xml中命令鏈文件初始值chainConfig,若是沒有,則用默認的 "org/apache/struts/chain/chain-config.xml"
調用 initModuleConfigFactory()和 initModuleConfig("", config),建立 ModuleConfig 對象。Struts中的MessageResource、PlugIn、數據源等,都是經過ModuleConfig來實現的;
調用initModuleMessageResources(moduleConfig),用戶資源文件的初始化;
調用initModulePlugIns(moduleConfig),用戶插件的初始化;
調用initModuleFormBeans(moduleConfig); initModuleForwards(moduleConfig); initModuleExceptionConfigs(moduleConfig); initModuleActions(moduleConfig),把struts配置文件中的其餘配置存儲到servletContext中;
調用moduleConfig.freeze(),固定組件配置;隨後解析以"config/"開頭的其餘struts配置文件,遍歷web.xml中servletConfig配置的initParameterNames,如發現以"config/" 開始的parameter,則根據此值初始化其它的ModuleConfig;
以後 調用initModulePrefixes(this.getServletContext()),initModulePrefixes(this.getServletContext()),初始化其餘模塊並存儲。 到此,ActionServlet初始化工做就算完成,後半段的初始化工做我解釋的不是很是詳細,只是想讀者去好好閱讀Struts的源代碼,去品味下開發Struts的人員是怎麼樣去實現各類功能的,雖然可能寫不出來,可是多閱讀對本身也是一種提升。
相關文章
相關標籤/搜索