struts2 處理請求流程分析(結合源碼)1

struts2 源碼版本2.0.11.1

本文是綜合網上部分人的分析成果,然後再自己結合源碼進行的,分析中如有錯誤,請指正。

   從struts2 中的web.xml的啓動配置可以看出,首先分析的是FilterDispatcher 這個過濾器類。

 

1、過濾器的初始化方法 void init(FilterConfig filterConfig)

//初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
    	 this.filterConfig = filterConfig;
    	//獲得默認的參數,創建dispathcher 對象
        dispatcher = createDispatcher(filterConfig);
        dispatcher.init();
       
        String param = filterConfig.getInitParameter("packages");
        String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
        if (param != null) {
            packages = param + " " + packages;
        }
        this.pathPrefixes = parse(packages);
    }

 

    1.1、createDispatcher(filterConfig);方法,該方法的目的是創建Dispathcher 對象

 

  protected Dispatcher createDispatcher(FilterConfig filterConfig) {
    	//讀取相應過濾器的web.xml 配置
        Map<String,String> params = new HashMap<String,String>();
        for (Enumeration e = filterConfig.getInitParameterNames(); e.hasMoreElements(); ) {
            String name = (String) e.nextElement();
            String value = filterConfig.getInitParameter(name);
            params.put(name, value);
        }
        //可以看出Dispatcher 類包裝了ServletContext 和過濾器的web.xml 配置
        return new Dispatcher(filterConfig.getServletContext(), params);
    }

 

 

  1.2、dispatcher.init();方法,該方法對dispatcher進行了一系列的初始化工作,這個工作很重要也有點複雜,具體每個初始化的工作的流程怎樣,待有空閒的時候再繼續分析,網上也有人已經分析過了,如果有興趣可參照:http://zddava.iteye.com/blog/211795

 

public void init() {
    	if (configurationManager == null) {
    		configurationManager = new ConfigurationManager(BeanSelectionProvider.DEFAULT_BEAN_NAME);
    	}
    	//讀取properties信息,默認的default.properties
    	init_DefaultProperties(); // [1]
    	//讀取xml配置文件,默認的struts-default.xml,struts-plugin.xml,struts.xml
        init_TraditionalXmlConfigurations(); // [2]
      //讀取用戶自定義的struts.properties  
        init_LegacyStrutsProperties(); // [3]
       //讀取FilterDispatcher的配置中所定義的actionPackages屬性,傳說中的Struts 2 零配置所謂的零配置
        init_ZeroConfiguration(); // [4]
      //自定義的configProviders 
        init_CustomConfigurationProviders(); // [5]
      //該功能全面被註釋
        init_MethodConfigurationProvider();
      //載入FilterDispatcher傳進來的initParams   
        init_FilterInitParameters() ; // [6]
      //將配置文件中的bean與具體的類映射 
        init_AliasStandardObjects() ; // [7]
      //構建一個用於依賴注射的Container對象   
      //在這裏面會循環調用上面七個ConfigurationProvider的register方法   
      //其中的重點就是DefaultConfiguration的#reload()方法  
        Container container = init_PreloadConfiguration();
        init_CheckConfigurationReloading(container);
        init_CheckWebLogicWorkaround(container);
    }

 

   1.3、String param = filterConfig.getInitParameter("packages"); 以下的代碼。這個步驟載入了packages標籤下定義的靜態資源。 讀取web.xml中 的下面的配置路徑還有org.apache.struts2.static,template,org.apache.struts2.interceptor.debugging這三個包空間下邊的資源也會作爲靜態資源載入。

    <filter>
       <filter-name>struts2</filter-name>
       <filter-class>
           org.apache.struts2.dispatcher.FilterDispatcher
       </filter-class>
       <init-param>
           <param-name>packages</param-name>
           <param-value>cn.static.resource</param-value>
       </init-param>
    </filter>

 

    1.4、this.pathPrefixes = parse(packages);這個步驟是對packages 進行解析的。

  protected String[] parse(String packages) {
        if (packages == null) {
            return null;
        }
        List<String> pathPrefixes = new ArrayList<String>();
        StringTokenizer st = new StringTokenizer(packages, ", \n\t");
        while (st.hasMoreTokens()) {
            String pathPrefix = st.nextToken().replace('.', '/');
            if (!pathPrefix.endsWith("/")) {
                pathPrefix += "/";
            }
            pathPrefixes.add(pathPrefix);
        }
        return pathPrefixes.toArray(new String[pathPrefixes.size()]);
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章