您的位置:首页 > 编程语言 > Java开发

Struts2源代码分析(一)配置文件加载 .

2012-02-14 11:28 519 查看
   一直以来我都想找个时间好好研究一下Struts2的源代码,彻底弄清楚它的配置文件是如何加载和解析的?Action对象是如何创建的?属性等又是如何获取和注入的?拦截器和拦截器栈是如何实现的?       
       任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。

通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts 2框架。因为Struts 2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。

       在web.xml文件中可以如下方式配置Struts2:      

<!-- 配置Struts 2框架的核心Filter -->  
<filter>  
     <!-- 配置Struts 2核心Filter的名字 -->  
     <filter-name>struts</filter-name>  
       
     <!-- 配置Struts 2核心Filter的实现类 -->  
     <filter-class>  
           org.apache.struts2.dispatcher.FilterDispatcher  
     </filter-class>  
       
     <init-param>  
           <!-- 配置Struts 2的配置文件 -->  
           <param-name>config</param-name>  
           <param-value>  
                mystruts2.xml  
           </param-value>  
     </init-param>  
       
     <init-param>  
           <!-- 配置Struts 2框架默认加载的Action包结构 -->  
           <param-name>actionPackages</param-name>  
           <param-value>  
                com.struts2.test.web.action  
           </param-value>  
     </init-param>  
  
     <!-- 配置Struts 2框架的配置提供者类 -->  
     <init-param>  
           <param-name>configProviders</param-name>  
           <param-value>com.struts2.test.web.MyConfigurationProvider</param-value>  
     </init-param>  
       
     <!-- 配置Struts 2框架的常量 -->  
     <init-param>  
           <param-name>truts.enable.DynamicMethodInvocation</param-name>  
          <param-value>false</param-value>  
     </init-param>  
     <init-param>  
           <param-name>struts.devMode</param-name>  
          <param-value>false</param-value>  
     </init-param>  
     <init-param>  
           <param-name>struts.objectFactory</param-name>  
          <param-value>spring</param-value>  
     </init-param>  
</filter>  
  
<filter-mapping>  
    <!-- 配置Struts 2的核心FilterDispatcher拦截所有用户请求 -->  
    <filter-name>struts</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  

/** 
 * Initializes the filter by creating a default dispatcher and setting the 

 * default packages for static resources. 

 *  
 * @param filterConfig 

 *            The filter configuration 

 */  
public void init(FilterConfig filterConfig) throws ServletException  

{  
    this.filterConfig = filterConfig;  

  
    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);  

}  

/**
* Initializes the filter by creating a default dispatcher and setting the
* default packages for static resources.
*
* @param filterConfig
*            The filter configuration
*/
public void init(FilterConfig filterConfig) throws ServletException
{
this.filterConfig = filterConfig;

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);
}


      其中dispatcher = createDispatcher(filterConfig);实际上是取得过滤器初始化参数,构造成参数名称和参数值的映射,并且

创建了一个Dispather工具类的对象,关键的代码是那一句dispatcher.init() 。

public void init()  

    {  
  
        if (configurationManager == null)  

        {  
            configurationManager = new ConfigurationManager(  

                    BeanSelectionProvider.DEFAULT_BEAN_NAME);  

        }  
  
        //设置org/apache/struts2/default.properties文件的配置解析提供者
  
        init_DefaultProperties(); // [1]
  
          
        /** 
         *  
         * config 
         * 该参数的值是一个以英文逗号(,)隔开的字符串, 

         * 每个字符串都是一个XML配置文件的位置。 

         * 默认配置文件为struts-default.xml,struts-plugin.xml,struts.xml 

         * 这三个文件的配置解析提供者 

         */  
        init_TraditionalXmlConfigurations(); // [2]
  
          
        /** 
         * 设置struts.properties文件的配置解析提供者 

         * 这个文件中的配置可以覆盖default.properties中的 

         */  
        init_LegacyStrutsProperties(); // [3]
  
          
        /** 
         * actionPackages 
         * 该参数的值也是一个以英文逗号(,)隔开的字符串, 

         * 每个字符串都是一个包空间, 
         * Struts 2框架将扫描这些包空间下的Action类。 

         */  
        init_ZeroConfiguration(); // [4]
  
          
        /** 
         * 加载用户定制的配置管理器 
         * configProviders 

         * 如果用户需要实现自己的ConfigurationProvider类, 

         * 用户可以提供一个或多个实现了ConfigurationProvider接口的类, 

         * 然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开 

         */  

        init_CustomConfigurationProviders(); // [5]
  
          
        //该方法暂为空   
        init_MethodConfigurationProvider();  
          
        /** 
         * 此方法用来处理FilterDispatcher的配置中所定义的所有属性 

         */  

        init_FilterInitParameters(); // [6]
  
          
        /** 
         * 选择框架实现的关键扩展点,用于装载属性常量. 

         * struts-default.xml中Struts2到底选择了那些实现类作为Struts2或者XWork内部接口默认实现类呢 

         * 默认情况下struts-default.xml中定义beanname="struts"将被作为默认接口实现类被注入这些默认行为是 

         * 由org.apache.struts2.config.BeanSelectionProvider所决定有兴趣读者可以参阅这个类源码  

         * 选择的实现是从container builder使用的名字定义关联属性,默认名为”struts” 

         */  
        init_AliasStandardObjects(); // [7]
  
  
        Container container = init_PreloadConfiguration();  

        init_CheckConfigurationReloading(container);  
        init_CheckWebLogicWorkaround(container);  
  
    }  

public void init()
{

if (configurationManager == null)
{
configurationManager = new ConfigurationManager(
BeanSelectionProvider.DEFAULT_BEAN_NAME);
}

//设置org/apache/struts2/default.properties文件的配置解析提供者
init_DefaultProperties(); // [1]

/**
*
* config
* 该参数的值是一个以英文逗号(,)隔开的字符串,
* 每个字符串都是一个XML配置文件的位置。
* 默认配置文件为struts-default.xml,struts-plugin.xml,struts.xml
* 这三个文件的配置解析提供者
*/
init_TraditionalXmlConfigurations(); // [2]

/**
* 设置struts.properties文件的配置解析提供者
* 这个文件中的配置可以覆盖default.properties中的
*/
init_LegacyStrutsProperties(); // [3]

/**
* actionPackages
* 该参数的值也是一个以英文逗号(,)隔开的字符串,
* 每个字符串都是一个包空间,
* Struts 2框架将扫描这些包空间下的Action类。
*/
init_ZeroConfiguration(); // [4]

/**
* 加载用户定制的配置管理器
* configProviders
* 如果用户需要实现自己的ConfigurationProvider类,
* 用户可以提供一个或多个实现了ConfigurationProvider接口的类,
* 然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开
*/
init_CustomConfigurationProviders(); // [5]

//该方法暂为空
init_MethodConfigurationProvider();

/**
* 此方法用来处理FilterDispatcher的配置中所定义的所有属性
*/
init_FilterInitParameters(); // [6]

/**
* 选择框架实现的关键扩展点,用于装载属性常量.
* struts-default.xml中Struts2到底选择了那些实现类作为Struts2或者XWork内部接口默认实现类呢
* 默认情况下struts-default.xml中定义beanname="struts"将被作为默认接口实现类被注入这些默认行为是
* 由org.apache.struts2.config.BeanSelectionProvider所决定有兴趣读者可以参阅这个类源码
* 选择的实现是从container builder使用的名字定义关联属性,默认名为”struts”
*/
init_AliasStandardObjects(); // [7]

Container container = init_PreloadConfiguration();
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);

}

   dispather.init()方法,主要包括两部分,其中  

  if (configurationManager == null)

  {

      configurationManager = new ConfigurationManager(

              BeanSelectionProvider.DEFAULT_BEAN_NAME);

  }

  init_DefaultProperties(); // [1]  

  init_TraditionalXmlConfigurations(); // [2]

  init_LegacyStrutsProperties(); // [3]

  init_ZeroConfiguration(); // [4]

  init_CustomConfigurationProviders(); // [5]

  init_MethodConfigurationProvider();

  init_FilterInitParameters(); // [6]

  init_AliasStandardObjects(); // [7]  

是构造一个配置管理器实例对象,再将不同配置文件的解析类(配置提供者)和配置文件对应起来构造成一个配置提供者列表,供在后续的加载配置文件时使用。这里涉及两个概念,一个是配置管理器(com.opensymphony.xwork2.config.ConfigurationManager),它是整个Struts2的配置文件管理员;另
a50b
一个是配置提供者,一个配置提供者完成对一个特定格式的配置文件的解析,在Struts中使用到的配置文件与配置提供者之间是一对一的关系。一个配置管理器实例对象包含一个配置提供者列表对象(List<ConfigurationProvider>
configurationProviders)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息