本文按照1.構(gòu)造函數(shù)->2.init()->3.do*()->4.destroy()的順序,解析ActionServlet的工作原理。
init()的初始化工作分為個步驟進(jìn)行:
1.initInternal()資源文件的初始化

protected String internalName = "org.apache.struts.action.ActionResources";
protected void initInternal(){
internal 
= MessageResources.getMessageResources(internalName);//初始化資源文件信息,通過工廠模式取得一個單例的資源
}


internalName與initInternal()都是protected所以可以被子類重載。修改struts默認(rèn)的資源文件信息。
2.initOther()根據(jù)web.xml的配置參數(shù)執(zhí)行不同的初始化,1.設(shè)置struts配置文件路徑2.convertNull

protected void initOther()throws ServletException {
        String value;
        value 
= getServletConfig().getInitParameter("config");
        
if (value != null{
            config 
= value; //設(shè)置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執(zhí)行
            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();//取得設(shè)置servletName
        /*digester主要是實(shí)現(xiàn)對xml的訪問,許多功能強(qiáng)大的常用操作都已經(jīng)封裝了起來。*/
        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句的意思是當(dāng)遇到web-app/servlet-mapping時執(zhí)行addServletMapping函數(shù)(下面有該函數(shù)的源碼),這個方法有兩個參數(shù),第一個是web-app/servlet-mapping/servlet-name標(biāo)簽里的,第二個是web-app/servlet-mapping/url-pattern標(biāo)簽里的.parse (input)開始解析。實(shí)際上這段陌生的代碼只是執(zhí)行了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()中被調(diào)用*/
    
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;
        }

    }

 

(初始化工作還未完成,待續(xù))