概述
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)模式。