Struts2(三)配置详解
一、概述
Struts2提供了多种可选的配置文件形式。
其中,struts-default.xml和default.properties是框架级别的配置文件,这两个文件在Struts的核心JAR包中,它们将在应用程序启动时被struts的初始化程序读取并加载。而struts.xml和struts.properties是应用级别的配置文件,它的结构与框架级别的相同,但是其中的定义会覆盖框架级别的定义。除此之外,还可以通过Struts2的插件来进行应用级别的配置定义,这一配置定义在插件所在JAR包的根目录,并以struts-plugin.xml的文件名形式出现。
配置文件的加载顺序:
public void init()
{ if (configurationManager == null) { configurationManager = createConfigurationManager(DefaultBeanSelectionProvider.DEFAULT_BEAN_NAME); } try { init_FileManager(); init_DefaultProperties(); // [1] init_TraditionalXmlConfigurations(); // [2] init_LegacyStrutsProperties(); // [3] init_CustomConfigurationProviders(); // [5] init_FilterInitParameters() ; // [6] init_AliasStandardObjects() ; // [7] Container container = init_PreloadConfiguration(); ... } }
从上段代码可以分析出,struts2配置文件的加载顺序为:default.properties->struts-defaultxml->struts-plugin.xml->struts.xml->struts.properties->struts.locale。
二、Struts配置元素定义
Struts2框架中的XML文件的配置元素定义是Properties文件的配置元素定义的超集,凡是能够在Properties文件中定义的配置元素,我们都可以在XML中找到相应的配置方式代替。下面我们从struts-default.xml文件入手,分析Struts配置元素的定义,部分源码如下:
<struts> <constant name="struts.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" /> <constant name="struts.dispatcher.errorHandler" value="struts" /> <!-- Silly workarounds for OGNL since there is currently no way to flush its internal caches --> <bean type="ognl.PropertyAccessor" name="java.util.ArrayList" class="com.opensymphony.xwork2.ognl.accessor.XWorkListPropertyAccessor" /> <bean type="ognl.PropertyAccessor" name="java.util.HashSet" class="com.opensymphony.xwork2.ognl.accessor.XWorkCollectionPropertyAccessor" /> <bean type="ognl.PropertyAccessor" name="java.util.HashMap" class="com.opensymphony.xwork2.ognl.accessor.XWorkMapPropertyAccessor" /> <!-- 此处省略 --> <bean type="com.opensymphony.xwork2.security.ExcludedPatternsChecker" name="struts" class="com.opensymphony.xwork2.security.DefaultExcludedPatternsChecker" scope="default" /> <bean type="com.opensymphony.xwork2.security.AcceptedPatternsChecker" name="struts" class="com.opensymphony.xwork2.security.DefaultAcceptedPatternsChecker" scope="default" /> <package name="struts-default" abstract="true"> <result-types> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <!-- 此处省略 --> </result-types> <interceptors> <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/> <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/> <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> <!-- 此处省略 --> <!-- Sample validation and workflow stack --> <interceptor-stack name="validationWorkflowStack"> <interceptor-ref name="basicStack"/> <interceptor-ref name="validation"/> <interceptor-ref name="workflow"/> </interceptor-stack> <!-- Sample file upload stack --> <interceptor-stack name="fileUploadStack"> <interceptor-ref name="fileUpload"/> <interceptor-ref name="basicStack"/> </interceptor-stack> <!-- 此处省略 --> </interceptors> <default-interceptor-ref name="defaultStack"/> <default-class-ref class="com.opensymphony.xwork2.ActionSupport" /> </package> </struts>
1. bean节点
bean节点是一个用于描述接口及其实现类映射关系的节点,Struts2在框架级别实现了一个对象容器,并将配置文件中所有的bean节点所定义的对象纳入容器之中管理。Struts通过这个容器在框架级别负责这些对象的创建、销毁以及依赖关系的处理。
2. constant节点
该节点主要用于定义Struts2运行时的参数
3. package节点
该节点包含了众多子节点,ResultType、Interceptor、InterceptorStack、Action等,这些子节点均继承与XWork框架。package节点作用主要是定义一种映射关系,反映了框架如何与外部程序进行交互的过程。
在package节点的属性中,name是唯一的标识符,namespace则从命名空间的角度为整个事件请求机制划分为不同的种类。package节点的extends属性允许package与package之间形成相应的继承关系,通过继承,子package自动获取父package的所有配置定义。
4. include节点
include节点的主要作用是帮助我们管理Struts2的配置文件,实现配置文件的模块化。我们可以在应用级别的配置文件(struts.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> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="index"> <result type="redirectAction"> <param name="actionName">HelloWorld</param> <param name="namespace">/example</param> </result> </action> </package> <include file="example.xml"/> <!-- Add packages here --> </struts>
struts.xml是Struts 2框架的核心配置文件,主要用于配置和管理开发人员编写的action。在这个配置文件中可以配置作用于action的拦截器、action和result的映射等。通常struts.xml从struts-default.xml继承默认的包定义。
struts.xml文件的元素结构如下图:
*:表示0个或多个元素
?:表示该元素是可选的
+:表示该元素至少有一个或多个
没有添加这三种符号表明这种元素是必需的。