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个或多个元素

  ?:表示该元素是可选的

  +:表示该元素至少有一个或多个

  没有添加这三种符号表明这种元素是必需的。

  

posted @ 2015-10-22 15:04  温布利往事  阅读(2006)  评论(1编辑  收藏  举报