Struts 源码学习之ActionServlet (四)

Struts 源码学习之ActionServlet (四)

/* 循环struts 配置文件(用"," 分开的多个struts 配置文件)并解析, parseModuleConfigFile 执行之后可以 struts-config.xml 等配置文件中得到 Ⅱ 中 actionConfigs/actionConfigListexceptions formBeansforwardsmessageResourcesplugIns 等的配置,并把得到的所有值封装到对象 ModuleConfig 对象(config) */

List urls = splitAndResolvePaths(paths);

URL url;

for (Iterator i = urls.iterator(); i.hasNext();) {

    url = (URL) i.next();

    digester.push(config);

    this.parseModuleConfigFile (digester, url);

}

 

// config 存储到servletContext ,属性名为Globals.MODULE_KEY

" org.apache.struts.action.MODULE "

getServletContext().setAttribute(Globals.MODULE_KEY

            + config.getPrefix(), config);

 

 

⑥ 用户资源文件的初始化 initModuleMessageResources(moduleConfig);

在上面第 步的 中我们已经创建了ModuleConfig 对象 并在struts-config.xml 等配置文件中得到 得到一些配置且封装到ModuleConfig 对象 中,所以在下面可以直接使用initModuleMessageResources(moduleConfig);

 

initModuleMessageResources(moduleConfig); 所做的工作:

/* moduleConfig 中读取所有的资源文件(包括 ① 内部资源文件 利用Digester 读取的struts 配置文件指定的用户资源文件) */

MessageResourcesConfig[] mrcs = config.findMessageResourcesConfigs();

注: 此时moduleConfig 中默认只含有① 内部资源文件 ActionResources.properties

 

// resources (包括 ① 内部资源文件 ⑥ 用户资源文件 )存储到servletContext // 属性名为mrcs[i].getKey() + config.getPrefix()

        for (int i = 0; i < mrcs.length; i++) {

            if ((mrcs[i].getFactory() == null)

                || (mrcs[i].getParameter() == null)) {

                continue;

            }

 

            if (log.isDebugEnabled()) {

                log.debug("Initializing module path '" + config.getPrefix()

                    + "' message resources from '" + mrcs[i].getParameter()

                    + "'");

            }

 

            String factory = mrcs[i].getFactory();

 

            MessageResourcesFactory.setFactoryClass(factory);

 

            MessageResourcesFactory factoryObject =

                MessageResourcesFactory.createFactory();

 

            factoryObject.setConfig(mrcs[i]);

 

            MessageResources resources =

                factoryObject.createResources(mrcs[i].getParameter());

 

            resources.setReturnNull(mrcs[i].getNull());

            resources.setEscape(mrcs[i].isEscape());

            getServletContext().setAttribute(mrcs[i].getKey()

                + config.getPrefix(), resources);

        }

 

 

⑦ 用户插件的初始化 initModulePlugIns(moduleConfig);

在上面第 步的 中我们已经创建了ModuleConfig 对象 并在struts-config.xml 等配置文件中得到 得到一些配置且封装到ModuleConfig 对象 中,所以在下面可以直接使用initModulePlugIns(ModuleConfig config);

 

initModulePlugIns(moduleConfig); 所做的工作:

// moduleConfig 中读取所有的插件文件

PlugInConfig[] plugInConfigs = config.findPlugInConfigs();

PlugIn[] plugIns = new PlugIn[plugInConfigs.length];

 

// 把所有plugIns 存储到servletContext

// 属性名为Globals.PLUG_INS_KEY + config.getPrefix()

.......

getServletContext().setAttribute(Globals.PLUG_INS_KEY

            + config.getPrefix(), plugIns);

.......

 

⑧ 把struts 配置文件中的其他配置 存储到servletContext ,包括

initModuleFormBeans(moduleConfig);

initModuleForwards(moduleConfig);

initModuleExceptionConfigs(moduleConfig);

initModuleActions(moduleConfig);

 

⑨ 调用 moduleConfig.freeze(); 固定组件配置

/* 使ModuleConfig 中的 actionConfigs/actionConfigListexceptions formBeansforwardsmessageResourcesplugIns 等的配置等变得不可改变 */

moduleConfig.freeze();

 

 

⑩ 解析以"config/" 开头的其他struts 配置文件

// 遍历web.xmlservletConfig 配置的 initParameterNames

// 如发现以" config/ " 开始的parameter ,则根据此值初始化其它的ModuleConfig

Enumeration names = getServletConfig().getInitParameterNames();

while (names.hasMoreElements()) {

    String name = (String) names.nextElement();

    if (!name.startsWith(configPrefix)) {

        continue;

    }

    String prefix = name.substring(configPrefixLength);

    moduleConfig =

        initModuleConfig(prefix,

             getServletConfig().getInitParameter(name));

    initModuleMessageResources(moduleConfig);

    initModulePlugIns(moduleConfig);

    initModuleFormBeans(moduleConfig);

    initModuleForwards(moduleConfig);

    initModuleExceptionConfigs(moduleConfig);

    initModuleActions(moduleConfig);

    moduleConfig.freeze();

}

<servlet>

        <servlet-name >action</servlet-name>

        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

        <init-param>

            <param-name>config</param-name>   <!-- 得到"config" 参数-->

            <param-value>/WEB-INF/struts-config.xml</param-value>

        </init-param>

        <init-param>

            <param-name>config/admin </param-name> <!-- 得到"config/admin" 参数-->

            <param-value>/WEB-INF/struts-config-admin.xml</param-value>

        </init-param>

        .......

    </servlet>

 

 

⑩ 解析以"config/" 开头的其他struts 配置文件 之后ActionServlet init() 方法还需要做

// 初始化其他模块的前缀

this.initModulePrefixes(this.getServletContext());

 

initModulePrefixes(this.getServletContext()); 所做的工作:

/* 把其他模块prefixes 存储到servletContext 中,属性名为

Globals.MODULE_PREFIXES_KEY" org.apache.struts.globals.MODULE_PREFIXES "*/

context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes);

 

// 设置configDigester = null ,释放内存

this.destroyConfigDigester();

 

 

至此struts 的核心类ActionServlet init() 方法完成servlet 的初始化工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值