Struts2的配置文件读取(二)

本文详细介绍了Struts2框架启动时的配置加载过程,包括ConfigurationProvider的初始化、注册及加载等关键步骤。深入剖析了DefaultPropertiesProvider、XmlConfigurationProvider等核心组件的功能与作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里,每一个ConfigurationProvider的#init(),#register(),和#loadPackages()都被调用了一遍,下面我们来看一下之前的七步操作中载入的几个ConfigurationProvider都注册和载入了什么

-------------------------------------------------------------------------------------------------

●第一个是DefaultPropertiesProvider

他的#init()为一个空函数,表明初始化时并没有执行任何操作。#loadPackages()并没有覆盖,使用的是直接基类的实现,而它的基类也定义了一个空的方法。

所以只剩下#register()方法了。

    public void register(ContainerBuilder builder, LocatableProperties props)
throws ConfigurationException {

Settings defaultSettings = null;
try {
defaultSettings = new PropertiesSettings("org/apache/struts2/default");
} catch (Exception e) {
throw new ConfigurationException("Could not find or error in org/apache/struts2/default.properties", e);
}

loadSettings(props, defaultSettings);
}


很明显,它载入了org/apache/struts2/default.properties。它默认在struts2-core-2.x.xx.jar的org/apache/struts2/下边。它定义了Struts2的默认属性,包括国际化,或者i18n等等,它可以被struts.properties覆盖。

-------------------------------------------------------------------------------------------------

●第二个是XmlConfigurationProvider和StrutsXmlConfigurationProvider。负责载入在web.xml中FilterDispatcher的参数path配置的xml文件。XmlConfigurationProvider专门负责载入xwork.xml,而StrutsXmlConfigurationProvider负责载入其他的xml配置文件。其中StrutsXmlConfigurationProvider是XmlConfigurationProvider的子类,主要的操作都是在XmlConfigurationProvider中实现的。这两个类实现了struts2主要的配置文件struts.xml(默认名称)等的读取。

#register()方法主要是注册框架需要的很多bean和常量(constant)。

而在#loadPackages()中,则载入了<package>标签中定义的配置内容。

一个完整的配置文件见下边:

<?xml version="1.0" encoding="UTF-8"?>
<struts>
<!-- include节点是struts2中组件化的方式 可以将每个功能模块独立到一个xml配置文件中 然后用include节点引用 -->
<include file="struts-default.xml"></include>

<!-- package提供了将多个Action组织为一个模块的方式。 package的名字必须是唯一的 package可以扩展 当一个package扩展自另一个package时该package会在本身配置的基础上加入扩展的package的配置 父package必须在子package前配置; name:package名称; extends:继承的父package名称; abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false; namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action -->
<package name="cn.test.struts2" extends="struts-default"
namespace="/test">
<interceptors>
<!-- 定义拦截器 name:拦截器名称 class:拦截器类路径 -->
<interceptor name="inter1" class="cn.test.Inter1"></interceptor>
<interceptor name="inter2" class="cn.test.Inter2"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="inter1"></interceptor-ref>
<interceptor-ref name="inter2"></interceptor-ref>
</interceptor-stack>
</interceptors>

<!-- 定义默认的拦截器 每个Action都会自动引用 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>

<!-- 全局results配置 -->
<global-results>
<result name="input">/error.jsp</result>
</global-results>

<!-- 全局exception配置 -->
<global-exception-mappings>
<exception-mapping result="input"
exception="java.sql.SQLException">
</exception-mapping>
</global-exception-mappings>

<!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同) name:action名称 class: 对应的类的路径 method: 调用Action中的方法名 -->
<action name="test" class="cn.test.TestAction">
<!-- 引用拦截器 name:拦截器名称或拦截器栈名称 -->
<interceptor-ref name="inter1"></interceptor-ref>

<!-- 节点配置 name : result名称 和Action中返回的值相同 type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher -->
<result name="success" type="dispatcher">
/success.jsp
</result>

<result name="failure" type="dispatcher">
/failure.jsp
</result>

<!-- 参数设置 name:对应Action中的get/set方法 -->
<param name="param">param</param>

<!-- 异常配置 -->
<exception-mapping result="failure"
exception="java.lang.Exception">
</exception-mapping>

<!-- 此package默认的Action配置 -->
<default-action-ref name="test">
<param name="param">default_param</param>
</default-action-ref>

</action>
</package>
</struts>


-------------------------------------------------------------------------------------------------

●第三个是LegacyPropertiesConfigurationProvider,载入struts.properties中的配置,这个文件中的配置可以覆盖default.properties中的。

-------------------------------------------------------------------------------------------------

●第四个是ClasspathConfigurationProvider,负责载入在web.xml中FilterDispatcher的参数actionPackages配置的Action。它负责将此配置中提到的包下所有以"Action"结尾的类和继承com.opensymphony.xwork2.Action的类作为Action载入框架。

-------------------------------------------------------------------------------------------------

●第五个是载入自定义的ConfigurationProvider,在web.xml中FilterDispatcher的参数configProviders配置

-------------------------------------------------------------------------------------------------

●第六个是props.putAll(initParams);将FilterDispatcher的参数载入了进去,不太清楚作用。

-------------------------------------------------------------------------------------------------

●第七个是BeanSelectionProvider。它的#register()方法中将配置文件中的bean与具体的类映射。默认使用的全是name为"struts"的bean。

-------------------------------------------------------------------------------------------------

下面再次回到FilterDispatcher的#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);


这个步骤载入了packages标签下定义的静态资源。
例如web.xml中进行了如下定义
    <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>


FilterDispatcher会将cn.static.resource包下的文件当作静态资源处理,即直接在页面上显示文件内容,不过会忽略扩展名为class的文件。比如在cn.static.resource包下有一个test.txt的文本文件,其内容为“test”,访问http://localhost:8081/Struts2Demo/struts/test.txt时会显示:test

另外,对org.apache.struts2.static,template,org.apache.struts2.interceptor.debugging这三个包空间下边的资源也会作为静态资源载入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值