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的插件。