struts.xml配置文件4_上


概述

       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代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  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代碼  收藏代碼
  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)模式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章