本文按照1.構造函數->2.init()->3.do*()->4.destroy()的順序,解析ActionServlet的工作原理。
init()的初始化工作分為個步驟進行:
1.initInternal()資源文件的初始化
protected String internalName = "org.apache.struts.action.ActionResources";

protected void initInternal()
{
internal = MessageResources.getMessageResources(internalName);//初始化資源文件信息,通過工廠模式取得一個單例的資源
}
internalName與initInternal()都是protected所以可以被子類重載。修改struts默認的資源文件信息。
2.initOther()根據web.xml的配置參數執行不同的初始化,1.設置struts配置文件路徑2.convertNull

protected void initOther()throws ServletException
{
String value;
value = getServletConfig().getInitParameter("config");

if (value != null)
{
config = value; //設置struts配置文件路徑
}
value = getServletConfig().getInitParameter("convertNull");
if ("true".equalsIgnoreCase(value) || "yes".equalsIgnoreCase(value)
|| "on".equalsIgnoreCase(value) || "y".equalsIgnoreCase(value)

|| "1".equalsIgnoreCase(value))
{
convertNull = true;
}

if (convertNull)
{ //如果convertNull為true\on\yes\y\1執行
ConvertUtils.deregister();
ConvertUtils.register(new BigDecimalConverter(null),BigDecimal.class);
……
}
}

3.initServlet()解析servletName,url-Pattern。官方struts的web.xml:servletName=action,urlPattern=/*.do

protected void initServlet()throws ServletException
{
this.servletName = getServletConfig().getServletName();//取得設置servletName

/**//*digester主要是實現對xml的訪問,許多功能強大的常用操作都已經封裝了起來。*/
Digester digester = new Digester();
digester.push(this);
digester.setNamespaceAware(true);
digester.setValidating(false);

for (int i = 0; i < registrations.length; i += 2)
{
URL url = this.getClass().getResource(registrations[i + 1]);

if (url != null)
{
digester.register(registrations[i], url.toString());
}
}

/**//*以下3句的意思是當遇到web-app/servlet-mapping時執行addServletMapping函數(下面有該函數的源碼),這個方法有兩個參數,第一個是web-app/servlet-mapping/servlet-name標簽里的,第二個是web-app/servlet-mapping/url-pattern標簽里的.parse (input)開始解析。實際上這段陌生的代碼只是執行了addServletMapping(servlet-name,url-pattern);servlet-name,url-pattern分別從/WEB-INF/web.xml中取得*/
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);
InputStream input =
getServletContext().getResourceAsStream("/WEB-INF/web.xml");
digester.parse(input);

if (servletMapping != null)
{
getServletContext().setAttribute(Globals.SERVLET_KEY, servletMapping);
}
}



/**//*在initServlet()中被調用*/

public void addServletMapping(String servletName, String urlPattern)
{

if (servletName == null)
{
return;
}

/**//*一般而言servletName=action,urlPattern=/*.do*/

if (servletName.equals(this.servletName))
{

if (log.isDebugEnabled())
{
log.debug("Process servletName=" + servletName
+ ", urlPattern=" + urlPattern);
}

this.servletMapping = urlPattern;
}
}
(初始化工作還未完成,待續)