概述

       Struts 2用配置文件(struts.xml)初始化它的资源。这些资源包括:

拦截器---用于预处理和后处理请求的拦截器
Action类---用于调用业务逻辑处理和数据访问代码的Action类
结果---可以用JavaServer Pages, Velocity 和 FreeMarker模板预览的结果

       在运行时,一个程序只有一个配置。这个配置是在运行前由一个或者多个的xml文件定义而成的,包括默认的struts.xml文件。可以配置的元素有:packages,namespaces, includes, actions, results, interceptors, 和 exceptions。

       Struts.xml是Struts2 框架的核心配置,它要放在web程序的classpath中。

       Struts 2 配置文件的特性:

       Struts.xml允许被拆分成几个小的文件,然后可以根据需要引进要包含的配置文件。例如:


Html代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <struts>

  2.    .....    

  3.    ......    

  4. <includefile="file1.xml"/>

  5. <includefile="file2.xml"/>

  6.    .....    

  7.    .....    

  8. </struts>

        你甚至可以将struts-plugin.xml文件放在一个JAR包里,它会自动被加载到程序中。这有助于程序员开发自配置的组件。


       如果你想要使用其它框架如Freemaker和Velocity,这些模块也可以放到classpath中然后从classpath加载。这样开发人员就可以将所有的模块打包进一个JAR文件里。

Struts.xml文件结构

       先看一下一个简单的struts.xml文件。

Html代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE strutsPUBLIC    

  3. "-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"    

  4. "http://struts.apache.org/dtds/struts-2.0.dtd">

  5. <struts>

  6. <constantname="struts.enable.DynamicMethodInvocation"value="false" />

  7. <constantname="struts.devMode"value="true" />

  8. <packagename="com.stuqbx.helloworld.action"namespace="/action" extends="struts-default">

  9. <actionname="HelloWorld"class="com.stuqbx.helloworld.action. HelloWorld">

  10. <result>/pages/HelloWorld.jsp</result>

  11. </action>

  12. <!-- Add actions here -->

  13. </package>

  14. <!-- Add packages here -->

  15. </struts>

       Struts.xml是由Struts2.0 DTD定义的(DTD(Document Type Definition)用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。 DTD语言定义的文档类型是SGML家族的标记性语言(包括SGML,XML,HTML))。Struts 2.0 DTD定义了struts.xml的结构和元素信息。附Struts 2.0 DTD文件。


Xml代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <!-- Strutsconfiguration DTD. Use the following DOCTYPE <!DOCTYPE struts    

  2.      PUBLIC "-//Apache SoftwareFoundation//DTD Struts Configuration 2.0//EN"    

  3.      "http://struts.apache.org/dtds/struts-2.0.dtd">-->

  4. <!ELEMENT struts(package|include|bean|constant)*>

  5. <!ELEMENT package(result-types?, interceptors?,    

  6. default-interceptor-ref?,default-action-ref?, global-results?,    

  7. global-exception-mappings?,action*)>

  8. <!ATTLIST packag    

  9.    name CDATA #REQUIRE    

  10.    extends CDATA #IMPLIE    

  11.    namespace CDATA #IMPLIE    

  12.    abstract CDATA #IMPLIE    

  13.    externalReferenceResolver NMTOKEN #IMPLIE    

  14. >

  15. <!ELEMENT result-types(result-type+)>

  16. <!ELEMENT result-type (param*)>

  17. <!ATTLIST result-typ    

  18.    name CDATA #REQUIRE    

  19.    class CDATA #REQUIRE    

  20.    default (true|false) "false    

  21. >

  22. <!ELEMENT interceptors(interceptor|interceptor-stack)+>

  23. <!ELEMENT interceptor (param*)    

  24. <!ATTLIST intercepto    

  25.    name CDATA #REQUIRE    

  26.    class CDATA #REQUIRE    

  27. >

  28. <!ELEMENT interceptor-stack(interceptor-ref+)>

  29. <!ATTLIST interceptor-stac    

  30.    name CDATA #REQUIRE    

  31. >

  32. <!ELEMENT interceptor-ref(param*)>

  33. <!ATTLIST interceptor-re    

  34.    name CDATA #REQUIRE    

  35. >

  36. <!ELEMENTdefault-interceptor-ref (param*)>

  37. <!ATTLIST default-interceptor-re    

  38.    name CDATA #REQUIRE    

  39. >

  40. <!ELEMENT default-action-ref(param*)>

  41. <!ATTLIST default-action-re    

  42.    name CDATA #REQUIRE    

  43. >

  44. <!ELEMENT global-results(result+)>

  45. <!ELEMENTglobal-exception-mappings (exception-mapping+)>

  46. <!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>

  47. <!ATTLIST actio    

  48.    name CDATA #REQUIRE    

  49.    class CDATA #IMPLIE    

  50.    method CDATA #IMPLIE    

  51.    converter CDATA #IMPLIE    

  52. >

  53. <!ELEMENT param (#PCDATA)>

  54. <!ATTLIST para    

  55.    name CDATA #REQUIRE    

  56. >

  57. <!ELEMENT result(#PCDATA|param)*>

  58. <!ATTLIST resul    

  59.    name CDATA #IMPLIE    

  60.    type CDATA #IMPLIE    

  61. >

  62. <!ELEMENT exception-mapping(#PCDATA|param)*>

  63. <!ATTLIST exception-mappin    

  64.    name CDATA #IMPLIE    

  65.    exception CDATA #REQUIRE    

  66.    result CDATA #REQUIRE    

  67. >

  68. <!ELEMENT include (#PCDATA)>

  69. <!ATTLIST includ    

  70.    file CDATA #REQUIRE    

  71. >

  72. <!ELEMENT bean (#PCDATA)>

  73. <!ATTLIST bea    

  74.    type CDATA #IMPLIE    

  75.    name CDATA #IMPLIE    

  76.    class CDATA #REQUIRE    

  77.    scope CDATA #IMPLIE    

  78.    static CDATA #IMPLIE    

  79.    optional CDATA #IMPLIE    

  80. >

  81. <!ELEMENT constant (#PCDATA)>

  82. <!ATTLIST constan    

  83.    name CDATA #REQUIRE    

  84.    value CDATA #REQUIRED      

  85. >


       如果程序的功能不依赖于struts.xml可以将它彻底删除掉。有一些配置是可选的如:注释(annotations), web.xml启动参数(web.xml startupparameters), 和 变化的URL映射规则(alternate URL mapping schemes)。还有一些配置是需要struts.xml文件的支持的如:全局结果(global results), 异常处理(exception handling), 以及自定义拦截器栈(the custom interceptor stacks)。

Struts.xml分析

       <struts>标签是整个struts.xml的根。它之下还包含package,include, bean和constant标签。

1.  package标签

       Package用来将actions, results, resulttypes, interceptors, and interceptor-stacks等组成一组并分成一个逻辑单元。每个package是多个Action、多个拦截器、多个拦截器引用的集合。Package和object类似,可以被继承,被子package重载(覆盖)。

Package用来组合具有相同属性的配置如相同的拦截器栈或者相同的命名空间。

属性

是否必须

描述

name

yes

用于其他package引用的唯一标识

必须唯一

extends

no

继承其他package的配置(在此之前配置的package)

要被扩展的包名

namespace

no

提供从URL到package的映射

例如:在两个namespace属性分别为pack1和pack2包中,访问的URL就应该是?/webApp/pack1/my.action和?/webApp/pack2/my.action

abstract

no

描述此package是否是abstract的(不能定义action)

true/false

       注:配置文件是按顺序从头开始处理加载的,所以扩展package所引用的package必须在此之前就定义好的。

       配置示例:

Xml代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <strut>

  2. <!--struts2的action必须放在一个指定的包空间下定义 -->

  3. <packagename="default"extends="struts-default">

  4. <!-- 定义处理请求URL为login.action的Action -->

  5. <actionname="login"class="com.stuqbx.helloworld.action.Login">

  6. <!-- 定义处理结果字符串和资源之间的映射关系 -->

  7. <resultnameresultnameresultnameresultname="success">/success.jsp</result>

  8. <resultnameresultnameresultnameresultname="error">/error.jsp</result>

  9. </action>

  10. </package>

  11. </struts>

2.  include标签

       include节点是struts2中组件化的方式。可以将每个功能模块独立到一个xml配置文件中,然后用include节点引用。它只有一个属性file,指定要引用的xml文件。这些引用的xml文件具有和struts.xml文件相同的结构。引用方式如下 :


Xml代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <struts>

  2. <includefile="invoices-config.xml"/>

  3. <includefile="admin-config.xml"/>

  4. <includefile="reports-config.xml"/>

  5. </struts>

       在include时,顺序很重要,因为配置信息是include之后才生效的。

       另外,有一些文件是隐式include的,这些文件有:struts-default.xml和struts-plugin.xml。这两个文件都包含默认的result types, interceptors, interceptor stacks,packages的配置也包含了web程序运行环境的配置信息(这些信息也可以在struts.properties中配置)。所不同的是,struts-default.xml提供了struts2的核心配置,而struts-plugin.xml提供了相关插件的配置信息。每个JAR插件都应该包含有一个struts-plugin.xml文件,他们在启动时被加载。

3.  bean标签

       大部分的程序都不需要扩展bean配置。Bean元素提供了class属性,用来指定用来创建和操作的Java类。一个bean可以被框架容器创建并注入到框架的内部对象中,或者被注入到静态方法中。

       第一种用法,对象注入,一般带有type属性,它告诉容器这个对象实现了那个接口。

       第二种用法,值注入,允许不是容器创建的对象接收框架传来的常量。但是,用来值注入的对象必须定义成静态属性。

属性

是否必须

描述

class

yes

Bean class的名字

type

no

类实现的主要java接口

name

no

Bean的唯一名字;必须在指定相同type的bean中唯一

scope

no

Bean的有效范围;必须是default, singleton, request, session, thread中的一个

static

no

是否注入静态方法;当type指定时,不能为true

optional

no

这个bean是否是可选的

       配置示例:


Xml代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <struts>

  2. <beantype="com.stuqbx.web.bean.ObjectFactory"name="factory"

  3. class="com.stuqbx.web.bean.MyObjectFactory"/>

  4.    ...    

  5. </struts>

4.  constant标签

       Constant有两个重要的应用:

       用来重新配置最大上传文件大小或者struts框架是否应该处于devMode(= development mode)模式。

       用来指定在多个实现给定type的bean中应该选择哪一个。

       Constants可以在多个文件中声明。默认的,constants是以下面的顺序搜索的,之后的覆盖之前的。

               struts-default.xml

               struts-plugin.xml

               struts.xml

               struts.properties

               web.xml

       在struts.properties文件中,每个条目都被认为是一个常量。在web.xml中,任何FilterDispatcher的初始化参数都是以常量被加载的。

属性

是否必须

描述

name

yes

常量的名字

value

yes

常量的值

       Struts2框架有两个核心配置文件,其中struts.xml文件主要负责管理应用中的Action映射, 及Action处理结果和物理资源之间的映射关系。除此之外,Struts2框架还包含了一个struts.properties文件,该文件主义了Struts2框架的大量常量属性。但通常推荐也是在struts.xml文件中来配置这些常量属性。

       配置示例:


Xml代码  struts.xml配置文件4_上_struts.xml配置文件
  1. <struts>

  2.            ...    

  3. <constantname="struts.custom.i18n.resources"value="messages" />

  4. <constantname="struts.devMode"value="true" />

  5. </struts>

       以上指定了资源文件的放置在classes目录下,基本名是messages,则在classes目录下您就应该放置类似messages_zh_CN.properties,message_en.properties名的文件。并且指定struts的模式是devMode(=development mode)模式。