Struts 2.x权威指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3.2 struts.xml配置文件

Struts框架的核心配置文件就是struts.xml,该文件主要负责管理Struts 2框架的业务控制器Action。

在默认情况下,Struts 2框架将自动加载放在WEB-INF/classes路径下的struts.xml文件。在大部分应用里,随着应用规模的增加,系统中的Action数量也大量增加,导致struts.xml配置文件变得非常臃肿。

为了避免struts.xml文件过于庞大、臃肿,提高struts.xml文件的可读性,我们可以将一个struts.xml配置文件分解成多个配置文件,然后在struts.xml文件中包含其他配置文件。

下面的struts.xml文件中就通过include手动导入了一个配置文件:struts-part1.xml文件,通过这种方式,就可以将Struts 2的Action按模块配置在多个配置文件中。

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 下面是Struts 2配置文件的根元素 -->
<struts>
    <!-- 通过include元素导入其他配置文件 -->
    <include file="struts-part1.xml" />
    ...
</struts>

通过这种方式,Struts 2提供了一种模块化的方式来管理struts.xml配置文件。

除此之外,Struts 2还提供了一种插件式的方式来管理配置文件。用WinRAR等解压缩软件打开struts2-core-2.3.1.2.jar文件,看到如图3.13所示的文件结构,在光标选中的一行,看到有一个struts-default.xml文件。

图3.13 struts2-core-2.3.1.2.jar压缩文件的文件结构

查看struts-default.xml文件,看到该文件代码片段如下:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- 指定Struts 2配置文件的DTD信息 -->
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <!-- Struts 2配置文件的根元素 -->
    <struts>
        <!-- 下面定义了Struts 2框架的一些基础Bean  -->
        <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
        <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts"
              class="org.apache.struts2.impl.StrutsObjectFactory" />
        ...
        <!-- 下面定义了Struts 2的默认包空间 -->
        <package name="struts-default">
              <!-- 定义Struts 2内建支持的结果类型 -->
              <result-types>
                    <!-- 定义Action链的Result类型 -->
                    <result-type name="chain"
                        class="com.opensymphony.xwork2.ActionChainResult"/>
                    <!-- 定义Dispatcher的Result类型,并设置default="true"
                        指定该结果Result是默认的Result类型 -->
                    <result-type name="dispatcher" default="true"
                        class="org.apache.struts2.dispatcher.ServletDispatcherResult" />
                    <!-- 定义FreeMarker的Result类型 -->
                    <result-type name="freemarker"
                        class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
                    ...
              </result-types>
              <!-- 定义Struts 2内建的拦截器 -->
              <interceptors>
                    <interceptor name="alias"
                        class="com.opensymphony.xwork2. interceptor.Alias Interceptor"/>
                    <interceptor name="autowiring"
                        class="com.opensymphony.xwork2.spring.interceptor.
ActionAutowiringInterceptor"/>
                    <interceptor name="chain"
                        class="com.opensymphony.xwork2.interceptor.Chaining Interceptor"/>
                    ...
                    <!-- 定义基本拦截器栈 -->
                <interceptor-stack name="basicStack">
                      <interceptor-ref name="exception"/>
                      <interceptor-ref name="servletConfig"/>
                      <interceptor-ref name="prepare"/>
                      <interceptor-ref name="checkbox"/>
                      <interceptor-ref name="multiselect"/>
                      <interceptor-ref name="actionMappingParams"/>
                      <interceptor-ref name="params">
                          <param name="excludeParams">dojo\..*,^struts\..*</param>
                      </interceptor-ref>
                      <interceptor-ref name="conversionError"/>
                </interceptor-stack>
                <!-- 还有系列拦截器栈 -->
                ...
          </interceptors>
          <!-- 定义默认的拦截器栈引用 -->
          <default-interceptor-ref name="defaultStack"/>
          <!-- 定义Action默认的处理类 -->
          <default-class-ref class="com.opensymphony.xwork2.ActionSupport" />
    </package>
</struts>

上面的代码并未全部列出struts-default.xml文件,只是列出了每个元素的代表。上面的配置文件中定义了一个名字为struts-default的包空间,该包空间里定义了Struts 2内建的Result类型,还定义了Struts 2内建的系列拦截器,以及由不同拦截器组成的拦截器栈,文件的最后还定义了默认的拦截器栈引用和Action默认的处理类。

这个struts-default.xml文件是Struts 2框架的默认配置文件,Struts 2框架每次都会自动加载该文件。查看我们前面使用的struts.xml文件,可以看到我们自己定义的package元素有如下代码片段:

<!-- 指定Struts 2配置文件的根元素 -->
<struts>
    <!-- 配置名为lee的包空间,继承struts-default包空间 -->
    <packagelt@span b=1> name="lee" extends="struts-default">
          ...
    </package>
</struts>

在上面的配置文件中,名为lee的包空间继承了名为struts-default的包空间,struts-default包空间就是在struts-default.xml文件中定义的。

不仅如此,Struts 2还允许以一种可插拔的方式来安装插件,例如后面将要介绍的Spring插件、JSF插件等,它们都提供了一个类似struts2-xxx-plugin.jar的文件——这个文件就是插件安装文件,只要将该文件放在Web应用的WEB-INF/lib路径下,Struts 2框架将自动加载该框架。

使用 WinRAR 工具打开 struts2-spring-plugin-2.3.1.2.jar 文件,找到一个 struts-plugin.xml文件,打开该文件,该文件的代码如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 定义一个名字为spring的ObjectFactory -->
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring"
          class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
    <!-- 指定名字为spring的ObjectFactory是Struts 2的ObjectFactory -->
    <constant name="struts.objectFactory" value="spring" />
    <!-- 省略一些其他常量配置 -->
    ...
    <!-- 定义名为spring-default的包空间 -->
    <package name="spring-default">
          <!-- 定义整合Spring框架所需的拦截器 -->
          <interceptors>
                <interceptor name="autowiring"
                      class="com.opensymphony.xwork2.spring.interceptor.
                      ActionAutowiringInterceptor"/>
          </interceptors>
    </package>
</struts>

在上面的配置文件中,配置了Struts 2与Spring框架整合所需的常量、拦截器等——这也是Struts 2框架使用Spring插件必需的配置。只要将struts2-spring-plugin-2.3.1.2.jar文件放在WEB-INF/lib路径下,Struts 2框架将自动加载该文件。

提示:

如果用户开发属于自己的Struts 2插件,只要将对应的struts-plugin.xml文件放在JAR文件中,Struts 2框架将自动加载该文件。通过这种方式,Struts 2框架允许使用可插拔的方式管理Struts 2的插件。