概述
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允许被拆分成几个小的文件,然后可以根据需要引进要包含的配置文件。例如:
<struts>
.....
......
<includefile="file1.xml"/>
<includefile="file2.xml"/>
.....
.....
</struts>
你甚至可以将struts-plugin.xml文件放在一个JAR包里,它会自动被加载到程序中。这有助于程序员开发自配置的组件。
如果你想要使用其它框架如Freemaker和Velocity,这些模块也可以放到classpath中然后从classpath加载。这样开发人员就可以将所有的模块打包进一个JAR文件里。
Struts.xml文件结构
先看一下一个简单的struts.xml文件。
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE strutsPUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constantname="struts.enable.DynamicMethodInvocation"value="false" />
<constantname="struts.devMode"value="true" />
<packagename="com.stuqbx.helloworld.action"namespace="/action" extends="struts-default">
<actionname="HelloWorld"class="com.stuqbx.helloworld.action. HelloWorld">
<result>/pages/HelloWorld.jsp</result>
</action>
<!-- Add actions here -->
</package>
<!-- Add packages here -->
</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文件。
<!-- Strutsconfiguration DTD. Use the following DOCTYPE <!DOCTYPE struts
PUBLIC "-//Apache SoftwareFoundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">-->
<!ELEMENT struts(package|include|bean|constant)*>
<!ELEMENT package(result-types?, interceptors?,
default-interceptor-ref?,default-action-ref?, global-results?,
global-exception-mappings?,action*)>
<!ATTLIST packag
name CDATA #REQUIRE
extends CDATA #IMPLIE
namespace CDATA #IMPLIE
abstract CDATA #IMPLIE
externalReferenceResolver NMTOKEN #IMPLIE
>
<!ELEMENT result-types(result-type+)>
<!ELEMENT result-type (param*)>
<!ATTLIST result-typ
name CDATA #REQUIRE
class CDATA #REQUIRE
default (true|false) "false
>
<!ELEMENT interceptors(interceptor|interceptor-stack)+>
<!ELEMENT interceptor (param*)
<!ATTLIST intercepto
name CDATA #REQUIRE
class CDATA #REQUIRE
>
<!ELEMENT interceptor-stack(interceptor-ref+)>
<!ATTLIST interceptor-stac
name CDATA #REQUIRE
>
<!ELEMENT interceptor-ref(param*)>
<!ATTLIST interceptor-re
name CDATA #REQUIRE
>
<!ELEMENTdefault-interceptor-ref (param*)>
<!ATTLIST default-interceptor-re
name CDATA #REQUIRE
>
<!ELEMENT default-action-ref(param*)>
<!ATTLIST default-action-re
name CDATA #REQUIRE
>
<!ELEMENT global-results(result+)>
<!ELEMENTglobal-exception-mappings (exception-mapping+)>
<!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>
<!ATTLIST actio
name CDATA #REQUIRE
class CDATA #IMPLIE
method CDATA #IMPLIE
converter CDATA #IMPLIE
>
<!ELEMENT param (#PCDATA)>
<!ATTLIST para
name CDATA #REQUIRE
>
<!ELEMENT result(#PCDATA|param)*>
<!ATTLIST resul
name CDATA #IMPLIE
type CDATA #IMPLIE
>
<!ELEMENT exception-mapping(#PCDATA|param)*>
<!ATTLIST exception-mappin
name CDATA #IMPLIE
exception CDATA #REQUIRE
result CDATA #REQUIRE
>
<!ELEMENT include (#PCDATA)>
<!ATTLIST includ
file CDATA #REQUIRE
>
<!ELEMENT bean (#PCDATA)>
<!ATTLIST bea
type CDATA #IMPLIE
name CDATA #IMPLIE
class CDATA #REQUIRE
scope CDATA #IMPLIE
static CDATA #IMPLIE
optional CDATA #IMPLIE
>
<!ELEMENT constant (#PCDATA)>
<!ATTLIST constan
name CDATA #REQUIRE
value CDATA #REQUIRED
>
如果程序的功能不依赖于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必须在此之前就定义好的。
配置示例:
<strut>
<!--struts2的action必须放在一个指定的包空间下定义 -->
<packagename="default"extends="struts-default">
<!-- 定义处理请求URL为login.action的Action -->
<actionname="login"class="com.stuqbx.helloworld.action.Login">
<!-- 定义处理结果字符串和资源之间的映射关系 -->
<resultnameresultnameresultnameresultname="success">/success.jsp</result>
<resultnameresultnameresultnameresultname="error">/error.jsp</result>
</action>
</package>
</struts>
2. include标签
include节点是struts2中组件化的方式。可以将每个功能模块独立到一个xml配置文件中,然后用include节点引用。它只有一个属性file,指定要引用的xml文件。这些引用的xml文件具有和struts.xml文件相同的结构。引用方式如下 :
<struts>
<includefile="invoices-config.xml"/>
<includefile="admin-config.xml"/>
<includefile="reports-config.xml"/>
</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是否是可选的 |
配置示例:
<struts>
<beantype="com.stuqbx.web.bean.ObjectFactory"name="factory"
class="com.stuqbx.web.bean.MyObjectFactory"/>
...
</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文件中来配置这些常量属性。
配置示例:
<struts>
...
<constantname="struts.custom.i18n.resources"value="messages" />
<constantname="struts.devMode"value="true" />
</struts>
以上指定了资源文件的放置在classes目录下,基本名是messages,则在classes目录下您就应该放置类似messages_zh_CN.properties,message_en.properties名的文件。并且指定struts的模式是devMode(=development mode)模式。