struts2源码系列(4)--配置文件解析

1.struts.xml配置文件主要有三个

strut2-default.xml(默认配置的),struts-plugin.xml(如果与spring整合),struts2.xml(自己配置的)

2.配置文件的加载流程

每一个配置文件的内容主要分为三类,一类是定义的bean,一类是常量<constant>,一类是package

3.解析package过程

入口方法:DefaultConfiguration-->reloadContainer()

  public synchronized List<PackageProvider> reloadContainer(List<ContainerProvider> providers) throws ConfigurationException {
                
            // 解析配置文件中的package标签
            for (final ContainerProvider containerProvider : providers)
            {
                if (containerProvider instanceof PackageProvider) {
                    container.inject(containerProvider);
                    ((PackageProvider)containerProvider).loadPackages();
                    packageProviders.add((PackageProvider)containerProvider);
                }
            }

}

接着进入XmlConfigurationProvider-->loadPackages()

for (Document doc : documents) {
            Element rootElement = doc.getDocumentElement();
            NodeList children = rootElement.getChildNodes();
            int childSize = children.getLength();

            for (int i = 0; i < childSize; i++) {
                Node childNode = children.item(i);

                if (childNode instanceof Element) {
                    Element child = (Element) childNode;

                    final String nodeName = child.getNodeName();

                    if ("package".equals(nodeName)) {
                        PackageConfig cfg = addPackage(child);//构造一个PackageConfig对象
                        if (cfg.isNeedsRefresh()) {
                            reloads.add(child);
                        }
                    }
                }
            }
            loadExtraConfiguration(doc);
        }

接下来就是解析<package>标签元素--

解析属性信息:extends属性--继承的父包名称   abstract--是否是抽象的包默认false  name--包的名称   namespace--命名空间默认""  strict-method-invocation--是否是严格的方法执行默认false

如果有继承的父包,则解析父包信息:根据配置的父包的名称,找到是否配置了这样一个包,如果找到了就把对应的父包PackageConfig添加进去,否则抛出异常不存在这样的父包

 

解析结果类型<result-types>--封装成LinkedHashmap---key 结果类型名称,value值为对应的结果类型class名称

解析拦截器 <interceptors>---封装成LinkedHashmap---key为拦截器名称,value值为拦截器class名称

解析默认的拦截器引用<default-interceptor-ref>--字符串---只取name属性,代表的确实多个拦截器(也就是拦截器栈)

解析默认的class引用<default-class-ref>---字符串--只取class属性,其实是一个类的class

解析全局的结果类型 <global-results>

解析全局的exception映射<global-exception-mappings>

解析action<action>---下面介绍

解析默认的action引用<default-action-ref>

4.解析action过程

入口:XmlConfigurationProvider-->addAction

这里同样会解析属性,子标签等,然后封装成ActionConfig,同时会放到PackageConfig的actionConfigs属性下

5.重建运行时配置

DefaultConfiguration--->rebuildRuntimeConfiguration()

第3,4步将配置文件解析完毕,仅仅解析出了配置文件里的内容。接下来是重建运行时配置

为什么要重建运行时配置?

因为,配置文件配置的只是用户配置的,还有好多的默认配置,需要重新解析一下,这样才能更好的处理请求。3,4步解析出来,自定义的ActionConfig PackageConfig中的拦截器,异常映射,返回结果类型等可能都是空的,这说明有继承父包的一些属性

比如:extends继承的父包的一些配置,一些全局性的配置(拦截器配置,异常映射配置等),重建以后,ActionConfig所需要的必要信息就全了。(拦截器信息不可少)

 

 

 

 

转载于:https://my.oschina.net/yibuliushen/blog/738317

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值