struts 初始化分析

来源:互联网 发布:搜索引擎优化的优缺点 编辑:程序博客网 时间:2024/05/01 23:09

 public void init() throws ServletException {
        try {
            initInternal();
            initOther();
            initServlet();
            getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
            initModuleConfigFactory();
            ModuleConfig moduleConfig = initModuleConfig("", config);
            initModuleMessageResources(moduleConfig);
            initModuleDataSources(moduleConfig);
            initModulePlugIns(moduleConfig);
            moduleConfig.freeze();
            Enumeration names = getServletConfig().getInitParameterNames();
            while (names.hasMoreElements()) {
                String name = (String) names.nextElement();
                if (!name.startsWith("config/")) {
                    continue;
                }
                String prefix = name.substring(6);
                moduleConfig = initModuleConfig
                    (prefix, getServletConfig().getInitParameter(name));
                initModuleMessageResources(moduleConfig);
                initModuleDataSources(moduleConfig);
                initModulePlugIns(moduleConfig);
                moduleConfig.freeze();
            }
            this.initModulePrefixes(this.getServletContext());
    }
先来看 initInternal();方法,代码如下: 
internal = MessageResources.getMessageResources(internalName);
   
public synchronized static MessageResources getMessageResources(String config) {
        if (defaultFactory == null) {
 /*创建一个MessageResources工厂*/
            defaultFactory = MessageResourcesFactory.createFactory();
        }
 /*创建一个MessageResources类*/
        return defaultFactory.createResources(config);
    }

initInternal();主要是初始化框架的内部消息绑定,支持国际化,实现多国语言。

然后是initOther(); 主要是获取struts的配置文件。
第一句代码是 value = getServletConfig().getInitParameter("config");
获得web.xml中的name为config的value="/WEB-INF/struts-config.xml";
value = getServletConfig().getInitParameter("convertNull");
获得convertNull的值,为以后的formbean进行类型转换。
initServlet();
第一句 this.servletName = getServletConfig().getServletName();
获取servelt的名字,一般为action
Digester digester = new Digester();该类是用来解析web.xml的解析器。
把struts-config.xml放入解析器这种,之后要逐步解析。
protected void initModuleConfigFactory()
protected ModuleConfig initModuleConfig(String prefix, String paths)
以上两句代码是创建一个ModuleConfigFactory,如果在web.xml中没有配置,则采用默认的
"org.apache.struts.config.impl.DefaultModuleConfigFactory";
ModuleConfig config = factoryObject.createModuleConfig(prefix);
生成一个ModuleConfig,ModuleConfig是个javabean,类中的成员变量主要来保存struts-config.xml
中转换后的java对象,如:actionForm,actionForward,actionMapping等。
然后对每一个配置文件进行逐一解析,this.parseModuleConfigFile(digester, path);解析之后的类被全部放在ModuleConfig的成员变量之中。最后   FormBeanConfig fbs[] = config.findFormBeanConfigs();
        for (int i = 0; i < fbs.length; i++) {
            if (fbs[i].getDynamic()) {
                fbs[i].getDynaActionFormClass();
            }
        }
如果是动态formBean,就放在DynaActionFormClass类的propertiesMap变量中,propertiesMap是个hashmap。

 initModuleMessageResources(moduleConfig);
 initModuleDataSources(moduleConfig);
 initModulePlugIns(moduleConfig);

上面这3句代码是用来分别初始化资源文件,数据源配置和插入,并把他们放入到servletContext中。

 接着 moduleConfig.freeze();这个方法是对moduleConfig中的每一个成员变量设置一个configured的标志为true。使moduleConfig变得不可改变。

最后调用this.destroyConfigDigester();释放内存资源。

 

http://lovedance.blogbus.com/logs/38038565.html

原创粉丝点击