Struts 2的基本流程

本文來自CSDN博客:http://blog.csdn.net/iww0616/archive/2008/02/20/2110534.aspx

經過前面介紹,我們已經基本瞭解了Struts 2框架的MVC實現。大致上,Struts 2框架由3個部分組成:核心控制器FilterDispatcher、業務控制器和用戶實現的業務邏輯組件。在這3個部分裏,Struts 2框架提供了核心控制器FilterDispatcher,而用戶需要實現業務控制器和業務邏輯組件。
3.4.1  核心控制器:FilterDispatcher
FilterDispatcher是Struts 2框架的核心控制器,該控制器作爲一個Filter運行在Web應用中,它負責攔截所有的用戶請求,當用戶請求到達時,該Filter會過濾用戶請求。如果用戶請求以action結尾,該請求將被轉入Struts 2框架處理。
Struts 2框架獲得了*.action請求後,將根據*.action請求的前面部分決定調用哪個業務邏輯組件,例如,對於login.action請求,Struts 2調用名爲login的Action來處理該請求。
Struts 2應用中的Action都被定義在struts.xml文件中,在該文件中定義Action時,定義了該Action的name屬性和class屬性,其中name屬性決定了該Action處理哪個用戶請求,而class屬性決定了該Action的實現類。
Struts 2用於處理用戶請求的Action實例,並不是用戶實現的業務控制器,而是Action代理——因爲用戶實現的業務控制器並沒有與Servlet API耦合,顯然無法處理用戶請求。而Struts 2框架提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入到Action中,並回調Action的execute方法來處理用戶請求。
顯然,上面的處理過程是典型的AOP(面向切面編程)處理方式。圖3.19顯示了這種處理模型。

圖3.19  Struts 2的攔截器和Action
從圖3.19中可以看出,用戶實現的Action類僅僅是Struts 2的Action代理的代理目標。用戶實現的業務控制器(Action)則包含了對用戶請求的處理。用戶的請求數據包含在HttpServletRequest對象裏,而用戶的Action類無需訪問HttpServletRequest對象。攔截器負責將HttpServletRequest裏的請求數據解析出來,並傳給業務邏輯組件Action實例。
3.4.2  業務控制器
正如從圖3.19所看到的,業務控制器組件就是用戶實現Action類的實例,Action類裏通常包含了一個execute方法,該方法返回一個字符串——該字符串就是一個邏輯視圖名,當業務控制器處理完用戶請求後,根據處理結果不同,execute方法返回不同字符串   ——每個字符串對應一個視圖名。
程序員開發出系統所需要的業務控制器後,還需要配置Struts 2的Action,即需要配置Action的如下三個部分定義:
—  Action所處理的URL。
—  Action組件所對應的實現類。
—  Action裏包含的邏輯視圖和物理資源之間的對應關係。
每個Action都要處理一個用戶請求,而用戶請求總是包含了指定URL。當Filter Dispatcher攔截到用戶請求後,根據請求的URL和Action處理URL之間的對應關係來處理轉發。
3.4.3  Struts 2的模型組件
實際上,模型組件已經超出了MVC框架的覆蓋範圍。對於Struts 2框架而言,通常沒有爲模型組件的實現提供太多的幫助。
Java EE應用裏的模型組件,通常指系統的業務邏輯組件。而隱藏在系統的業務邏輯組件下面的,可能還包含了DAO、領域對象等組件。
通常,MVC框架裏的業務控制器會調用模型組件的方法來處理用戶請求。也就是說,業務邏輯控制器不會對用戶請求進行任何實際處理,用戶請求最終由模型組件負責處理。業務控制器只是中間負責調度的調度器,這也是稱Action爲控制器的原因。
圖3.20顯示了這種處理流程。
 提示  在圖3.20中看到Action調用業務邏輯組件的方法。當控制器需要獲得業務邏輯組件實例時,通常並不會直接獲取業務邏輯組件實例,而是通過工廠模式來獲得業務邏輯組件的實例;或者利用其他IoC容器(如Spring容器)來管理業務邏輯組件的實例。
3.4.4  Struts 2的視圖組件
Struts 2已經改變了Struts 1只能使用JSP作爲視圖技術的現狀,Struts 2允許使用其他的模板技術,如FreeMarker、Velocity作爲視圖技術。
當Struts 2的控制器返回邏輯視圖名時,邏輯視圖並未與任何的視圖技術關聯,僅僅是返回一個字符串,該字符串作爲邏輯視圖名。
當我們在struts.xml文件中配置Action時,不僅需要指定Action的name屬性和class屬性,還要爲Action元素指定系列result子元素,每個result子元素定義一個邏輯視圖和物理視圖之間的映射。前面所介紹的應用都使用了JSP技術作爲視圖,故配置result子元素時沒有指定type屬性,默認使用JSP作爲視圖資源。
如果需要在Struts 2中使用其他視圖技術,則可以在配置result子元素時,指定相應的type屬性即可。例如,如果需要使用FreeMarker,則爲result指定值爲freemarker的type屬性;如果想使用Velocity模板技術作爲視圖資源,則爲result指定值爲velocity的type屬性……
3.4.5  Struts 2的運行流程
經過上面介紹,我們發現Struts 2框架的運行流程非常類似於WebWork框架的流程。
 提示  在Struts 2的官方站點,我們可以找到如下說法:Essentially,Struts 2.0 is the technical equivalent of WebWork 2.3。Aside from the package and property renaming,it isn't much different than,say,migrating from WebWork 2.1 to 2.2——意思是說:Struts 2.0技術等同於WebWork 2.3框架,除了包和屬性被改名外。從WebWork 2.2遷移到Struts 2不會比從WebWork 2.1遷移到WebWork 2.2更復雜。
這裏我們可以看到,Struts 2其實就是WebWork 2.2的升級版,這也就不難理解:爲什麼WebWork和Struts 2如此相似!
因此,Struts 2的運行流程與WebWork的運行流程完全相同,讀者可以參看圖1.8來了解Struts 2的運行流程。
3.5  Struts 2的基本配置
前面大致瞭解了Struts 2框架的基本內容,但這些基本內容都必須建立在Struts 2的配置文件基礎之上,這些配置文件的配置信息也是Struts 2應用的核心部分。
3.5.1  配置web.xml文件
任何MVC框架都需要與Web應用整合,這就不得不藉助於web.xml文件,只有配置在web.xml文件中Servlet纔會被應用加載。
通常,所有的MVC框架都需要Web應用加載一個核心控制器,對於Struts 2框架而言,需要加載FilterDispatcher,只要Web應用負責加載FilterDispatcher,FilterDispatcher將會加載應用的Struts 2框架。
因爲Struts 2將核心控制器設計成Filter,而不是一個普通Servlet。故爲了讓Web應用加載FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。
配置FilterDispatcher的代碼片段如下:
<!-- 配置Struts 2框架的核心Filter -->
<filter>
                                 <!-- 配置Struts 2核心Filter的名字 -->
                                 <filter-name>struts</filter-name>
                                 <!-- 配置Struts 2核心Filter的實現類 -->
                                  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher 
                                    </filter-class>
                                  <init-param>
                                    <!-- 配置Struts 2框架默認加載的Action包結構 -->
                                     <param-name>actionPackages</param-name>
                                  <param-value>org.apache.struts2.showcase.person</param-value>
                                 </init-param>
                                 <!-- 配置Struts 2框架的配置提供者類 -->
                                  <init-param>
                                     <param-name>configProviders </param-name>
                                  <param-value>lee.MyConfigurationProvider</param-value>
                                 </init-param>
</filter>
正如上面看到的,當配置Struts 2的FilterDispatcher類時,可以指定一系列的初始化參數,爲該Filter配置初始化參數時,其中有3個初始化參數有特殊意義:
—  config:該參數的值是一個以英文逗號(,)隔開的字符串,每個字符串都是一個XML配置文件的位置。Struts 2框架將自動加載該屬性指定的系列配置文件。
—  actionPackages:該參數的值也是一個以英文逗號(,)隔開的字符串,每個字符串都是一個包空間,Struts 2框架將掃描這些包空間下的Action類。
—  configProviders:如果用戶需要實現自己的ConfigurationProvider類,用戶可以提供一個或多個實現了ConfigurationProvider接口的類,然後將這些類的類名設置成該屬性的值,多個類名之間以英文逗號(,)隔開。
除此之外,還可在此處配置Struts 2常量,每個<init-param>元素配置一個Struts 2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。
 提示  關於Struts 2常量的講解,請參閱本書的4.1.2節。
在web.xml文件中配置了該Filter,還需要配置該Filter攔截的URL。通常,我們讓該Filter攔截所有的用戶請求,因此使用通配符來配置該Filter攔截的URL。
下面是配置該Filter攔截URL的配置片段:
<!-- 配置Filter攔截的URL -->
<filter-mapping>
                                 <!-- 配置Struts 2的核心FilterDispatcher攔截所有用戶請求 -->
                                 <filter-name>struts</filter-name>
                                  <url-pattern>/*</url-pattern>
</filter-mapping>
配置了Struts 2的核心FilterDispatcher後,基本完成了Struts 2在web.xml文件中的配置。
如果Web應用使用了Servlet 2.3以前的規範,因爲Web應用不會自動加載Struts 2框架的標籤文件,因此必須在web.xml文件中配置加載Struts 2標籤庫。
配置加載Struts 2標籤庫的配置片段如下:
<!-- 手動配置Struts 2的標籤庫 -->
<taglib>
                                 <!-- 配置Struts 2標籤庫的URI -->
                                 <taglib-uri>/s</taglib-uri>
                                 <!-- 指定Struts 2標籤庫定義文件的位置 -->
                                 <taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
</taglib>
在上面配置片段中,指定了Struts 2標籤庫配置文件物理位置:/WEB-INF/struts- tags.tld,因此我們必須手動複製Struts 2的標籤庫定義文件,將該文件放置在Web應用的WEB-INF路徑下。
如果Web應用使用Servlet 2.4以上的規範,則無需在web.xml文件中配置標籤庫定義,因爲Servlet 2.4規範會自動加載標籤庫定義文件。
 提示  Struts 2的標籤庫定義文件包含在struts2-core-2.0.6.jar文件裏,在struts2-core-2.0.6.jar文件的META-INF路徑下,包含了一個struts-tag.tld文件,這個文件就是Struts 2的標籤庫定義文件,Servlet 2.4規範會自動加載該標籤庫文件。
對於Servlet 2.4以上的規範,Web應用自動加載該標籤庫定義文件。加載struts-tag.tld標籤庫定義文件時,該文件的開始部分包含如下代碼片段:
<taglib>
                                 <!-- 定義標籤庫的版本 -->
                                 <tlib-version>2.2.3</tlib-version>
                                 <!-- 定義標籤庫所需的JSP版 -->
                                 <jsp-version>1.2</jsp-version>
                                 <short-name>s</short-name>
                                 <!-- 定義Struts 2標籤庫的URI -->
                                 <uri>/struts-tags</uri>
                                 ...
</taglib>
因爲該文件中已經定義了該標籤庫的URI:struts-tags,這就避免了在web.xml文件中重新定義Struts 2標籤庫文件的URI。
3.5.2  struts.xml配置文件
Struts框架的核心配置文件就是struts.xml配置文件,該文件主要負責管理Struts 2框架的業務控制器Action。
在默認情況下,Struts 2框架將自動加載放在WEB-INF/classes路徑下的struts.xml文件。在大部分應用裏,隨着應用規模的增加,系統中Action數量也大量增加,導致struts.xml配置文件變得非常臃腫。
爲了避免struts.xml文件過於龐大、臃腫,提高struts.xml文件的可讀性,我們可以將一個struts.xml配置文件分解成多個配置文件,然後在struts.xml文件中包含其他配置文件。
下面的struts.xml文件中就通過include手動導入了一個配置文件:struts-part1.xml文件,通過這種方式,就可以將Struts 2的Action按模塊配置在多個配置文件中。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- 下面是Struts 2配置文件的根元素 -->
<struts>
                                 <!-- 通過include元素導入其他配置文件 -->
                                  <include file="struts-part1.xml" />
                                 ...
</struts>
通過這種方式,Struts 2提供了一種模塊化的方式來管理struts.xml配置文件。
除此之外,Struts 2還提供了一種插件式的方式來管理配置文件。用WinRAR等解壓縮軟件打開struts2-core-2.0.6.jar文件,看到如圖3.21所示的文件結構,在光標選中的一行,看到有一個struts-default.xml文件。

圖3.21  struts2-core-2.0.6.jar壓縮文件的文件結構
查看struts-default.xml文件,看到該文件代碼片段如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- Struts 2配置文件的根元素 -->
<struts>
                                 <!-- 下面定義了Struts 2框架的一些基礎Bean  -->
                                 <bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
                                 <bean type="com.opensymphony.xwork2.ObjectFactory" name="struts"
                                    class="org.apache.struts2.impl.StrutsObjectFactory" />
                                 ....
                                  <!-- 下面是一些靜態注入Bean定義 -->
                                        <bean class="com.opensymphony.xwork2.util.OgnlValueStack" static="true" />
                                  <bean class="org.apache.struts2.dispatcher.Dispatcher" static="true" />
                                 ...
                                 <!-- 下面定義Struts 2的默認包空間 -->
                                  <package name="struts-default">
                                    <!-- 定義Struts 2內建支持的結果類型 -->
                                  <result-types>
                                        <!-- 定義Action鏈Result類型 -->
                                   <result-type name="chain" class="com.opensymphony.xwork2. 
                                            ActionChainResult"/>
                                        <!-- 定義Dispatcher的Result類型,並設置default="true",
                                            指定該結果Result是默認的Result類型 -->
                                        <result-type name="dispatcher" 
                                                class="org.apache.struts2.dispatcher.Servlet 
                                                    DispatcherResult" default="true"/>
                                        <!-- 定義FreeMarker的Result類型 -->
                                   <result-type name="freemarker"
                                            class="org.apache.struts2.views.freemarker. 
                                                FreemarkerResult"/>
                                        ...
                                  </result-types>
                                    <!-- 定義Struts 2內建的攔截器 -->
                                  <interceptors>
                                   <interceptor name="alias" class="com.opensymphony.xwork2. 
                                            interceptor.AliasInterceptor"/>
                                        <interceptor name="autowiring"
                                            class="com.opensymphony.xwork2.spring.interceptor. 
                                                ActionAutowiringInterceptor"/>
                                        ...
                                   <!-- 定義基本攔截器棧 -->
                                   <interceptor-stack name="basicStack">
                                   <interceptor-ref name="exception"/>
                                   <interceptor-ref name="servlet-config"/>
                                   <interceptor-ref name="prepare"/>
                                   <interceptor-ref name="checkbox"/>
                                   <interceptor-ref name="params"/>
                                   <interceptor-ref name="conversionError"/>
                                   </interceptor-stack>
                                        <!-- 還有系列攔截器棧 -->
                                        ... 
                                  </interceptors>
                                  <!-- 定義默認的攔截器棧引用 -->
                                  <default-interceptor-ref name="defaultStack"/>
                                  </package>
</struts>
上面的代碼並未全部列出struts-default.xml文件,只是列出了每個元素的代表。上面配置文件中定義了一個名字爲struts-default的包空間,該包空間裏定義了Struts 2內建的Result類型,還定義了Struts 2內建的系列攔截器,以及由不同攔截器組成的攔截器棧,文件的最後還定義了默認的攔截器引用。
這個struts-default.xml文件是Struts 2框架的默認配置文件,Struts 2框架每次都會自動加載該文件。查看我們前面使用的struts.xml文件,看到我們自己定義的package元素有如下代碼片段:
<!-- 指定Struts 2配置文件的根元素 -->
<struts>
                                 <!-- 配置名爲lee的包空間,繼承struts-default包空間 -->
    <package name="lee" extends="struts-default">
                                    ...
    </package>
</struts>
在上面配置文件中,名爲lee的包空間,繼承了名爲struts-default的包空間,struts-default包空間定義在struts-default.xml文件中。可見,Struts 2框架默認會加載struts-default.xml文件。
不僅如此,Struts 2框架提供了一種類似Eclipse的擴展方式,它允許以一種“可插拔”的方式來安裝插件,例如後面將要介紹的Spring插件、JSF插件等,它們都提供了一個類似struts2-Xxx-plugin.jar的文件——這個文件就是插件安裝文件,只要將該文件放在Web應用的WEB-INF/lib路徑下,Struts 2框架將自動加載該框架。
使用WinRAR工具打開struts2-spring-plugin2.06.jar文件,找到一個struts-plugin.xml文件,打開該文件,該文件的代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts>
                                 <!-- 定義一個名字爲spring的ObjectFactory -->
                                 <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring"
                                    class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
                                  <!-- 指定名字爲sping的ObjectFactory是Struts 2的ObjectFactory -->
                                  <constant name="struts.objectFactory" value="spring" />
                                 <!-- 定義名爲spring-default的包空間 -->
                                  <package name="spring-default">
                                    <!-- 定義整合Spring框架所必需的攔截器列表 -->
                                  <interceptors>
                                   <interceptor name="autowiring" 
                                            class="com.opensymphony.xwork2.spring.interceptor. 
                                                ActionAutowiringInterceptor"/>
                                   <interceptor name="sessionAutowiring" 
                                            class="org.apache.struts2.spring.interceptor. 
                                                SessionContextAutowiringInterceptor"/>
                                  </interceptors>
                                  </package>
</struts>
在上面配置文件中,配置了Struts 2與Spring框架整合必需的常量、攔截器等——這也是Struts 2框架使用Spring插件必需的配置。只要將struts2-spring-plugin2.06.jar文件放在WEB-INF/lib路徑下,Struts 2框架將自動加載該文件。
 提示  如果用戶開發屬於自己的Struts 2插件,只要將對應的struts-plugin. xml文件放在JAR文件中,Struts 2框架將自動加載該文件。通過這種方式,Struts 2框架允許使用可插拔的方式管理Struts 2的插件。
3.5.3  struts.properties配置文件
Struts 2框架有兩個核心配置文件,其中struts.xml文件主要負責管理應用中的Action映射,以及該Action包含的Result定義等。除此之外,Struts 2框架還包含一個struts.properties文件,該文件定義了Struts 2框架的大量屬性,開發者可以通過改變這些屬性來滿足應用的需求。
struts.properties文件是一個標準的Properties文件,該文件包含了系列的key-value對象,每個key就是一個Struts 2屬性,該key對應的value就是一個Struts 2屬性值。
struts.properties文件通常放在Web應用的WEB-INF/classes路徑下。實際上,只要將該文件放在Web應用的CLASSPATH路徑下,Struts 2框架就可以加載該文件。
現在的問題是,struts.properties文件的哪些key是有效的?即struts.properties文件裏包含哪些屬性是有效的Struts 2屬性。下面列出了可以在struts.properties中定義的Struts 2屬性。
—  struts.configuration:該屬性指定加載Struts 2配置文件的配置文件管理器。該屬性的默認值是org.apache.Struts2.config.DefaultConfiguration,這是Struts 2默認的配置文件管理器。如果需要實現自己的配置管理器,開發者則可以實現一個實現Configuration接口的類,該類可以自己加載Struts 2配置文件。
—  struts.locale:指定Web應用的默認Locale。
—  struts.i18n.encoding:指定Web應用的默認編碼集。該屬性對於處理中文請求參數非常有用,對於獲取中文請求參數值,應該將該屬性值設置爲GBK或者GB2312。
 提示  當設置該參數爲GBK時,相當於調用HttpServletRequest的setCharacterEncoding方法。
—  struts.objectFactory:指定Struts 2默認的ObjectFactory Bean,該屬性默認值是spring。
—  struts.objectFactory.spring.autoWire:指定Spring框架的自動裝配模式,該屬性的默認值是name,即默認根據Bean的name屬性自動裝配。
—  struts.objectFactory.spring.useClassCache:該屬性指定整合Spring框架時,是否緩存Bean實例,該屬性只允許使用true和false兩個屬性值,它的默認值是true。通常不建議修改該屬性值。
—  struts.objectTypeDeterminer:該屬性指定Struts 2的類型檢測機制,通常支持tiger和notiger兩個屬性值。
—  struts.multipart.parser:該屬性指定處理multipart/form-data的MIME類型(文件上傳)請求的框架,該屬性支持cos、pell和jakarta等屬性值,即分別對應使用cos的文件上傳框架、pell上傳及common-fileupload文件上傳框架。該屬性的默認值爲jakarta。
 注意  如果需要使用cos或者pell的文件上傳方式,則應該將對應的JAR文件複製到Web應用中。例如,使用cos上傳方式,則需要自己下載cos框架的JAR文件,並將該文件放在WEB-INF/lib路徑下。
—  struts.multipart.saveDir:該屬性指定上傳文件的臨時保存路徑,該屬性的默認值是javax.servlet.context.tempdir。
—  struts.multipart.maxSize:該屬性指定Struts 2文件上傳中整個請求內容允許的最大字節數。
—  struts.custom.properties:該屬性指定Struts 2應用加載用戶自定義的屬性文件,該自定義屬性文件指定的屬性不會覆蓋struts.properties文件中指定的屬性。如果需要加載多個自定義屬性文件,多個自定義屬性文件的文件名以英文逗號(,)隔開。
—  struts.mapper.class:指定將HTTP請求映射到指定Action的映射器,Struts 2提供了默認的映射器:org.apache.struts2.dispatcher.mapper.DefaultActionMapper。默認映射器根據請求的前綴與Action的name屬性完成映射。
—  struts.action.extension:該屬性指定需要Struts 2處理的請求後綴,該屬性的默認值是action,即所有匹配*.action的請求都由Struts 2處理。如果用戶需要指定多個請求後綴,則多個後綴之間以英文逗號(,)隔開。
—  struts.serve.static:該屬性設置是否通過JAR文件提供靜態內容服務,該屬性只支持true和false屬性值,該屬性的默認屬性值是true。
—  struts.serve.static.browserCache:該屬性設置瀏覽器是否緩存靜態內容。當應用處於開發階段時,我們希望每次請求都獲得服務器的最新響應,則可設置該屬性爲false。
—  struts.enable.DynamicMethodInvocation:該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性爲false。
—  struts.enable.SlashesInActionNames:該屬性設置Struts 2是否允許在Action名中使用斜線,該屬性的默認值是false。如果開發者希望允許在Action名中使用斜線,則可設置該屬性爲true。
—  struts.tag.altSyntax:該屬性指定是否允許在Struts 2標籤中使用表達式語法,因爲通常都需要在標籤中使用表達式語法,故此屬性應該設置爲true,該屬性的默認值是true。
—  struts.devMode:該屬性設置Struts 2應用是否使用開發模式。如果設置該屬性爲true,則可以在應用出錯時顯示更多、更友好的出錯提示。該屬性只接受true和flase兩個值,該屬性的默認值是false。通常,應用在開發階段,將該屬性設置爲true,當進入產品發佈階段後,則該屬性設置爲false。
—  struts.i18n.reload:該屬性設置是否每次HTTP請求到達時,系統都重新加載資源文件。該屬性默認值是false。在開發階段將該屬性設置爲true會更有利於開發,但在產品發佈階段應將該屬性設置爲false。
 提示  開發階段將該屬性設置了true,將可以在每次請求時都重新加載國際化資源文件,從而可以讓開發者看到實時開發效果;產品發佈階段應該將該屬性設置爲false,是爲了提供響應性能,每次請求都需要重新加載資源文件會大大降低應用的性能。
—  struts.ui.theme:該屬性指定視圖標籤默認的視圖主題,該屬性的默認值是xhtml。
—  struts.ui.templateDir:該屬性指定視圖主題所需要模板文件的位置,該屬性的默認值是template,即默認加載template路徑下的模板文件。
—  struts.ui.templateSuffix:該屬性指定模板文件的後綴,該屬性的默認屬性值是ftl。該屬性還允許使用ftl、vm或jsp,分別對應FreeMarker、Velocity和JSP模板。
—  struts.configuration.xml.reload:該屬性設置當struts.xml文件改變後,系統是否自動重新加載該文件。該屬性的默認值是false。
—  struts.velocity.configfile:該屬性指定Velocity框架所需的velocity.properties文件的位置。該屬性的默認值爲velocity.properties。
—  struts.velocity.contexts:該屬性指定Velocity框架的Context位置,如果該框架有多個Context,則多個Context之間以英文逗號(,)隔開。
—  struts.velocity.toolboxlocation:該屬性指定Velocity框架的toolbox的位置。
—  struts.url.http.port:該屬性指定Web應用所在的監聽端口。該屬性通常沒有太大的用戶,只是當Struts 2需要生成URL時(例如Url標籤),該屬性才提供Web應用的默認端口。
—  struts.url.https.port:該屬性類似於struts.url.http.port屬性的作用,區別是該屬性指定的是Web應用的加密服務端口。
—  struts.url.includeParams:該屬性指定Struts 2生成URL時是否包含請求參數。該屬性接受none、get和all三個屬性值,分別對應於不包含、僅包含GET類型請求參數和包含全部請求參數。
—  struts.custom.i18n.resources:該屬性指定Struts 2應用所需要的國際化資源文件,如果有多份國際化資源文件,則多個資源文件的文件名以英文逗號(,)隔開。
—  struts.dispatcher.parametersWorkaround:對於某些Java EE服務器,不支持HttpServlet Request調用getParameterMap()方法,此時可以設置該屬性值爲true來解決該問題。該屬性的默認值是false。對於WebLogic、Orion和OC4J服務器,通常應該設置該屬性爲true。
—  struts.freemarker.manager.classname:該屬性指定Struts 2使用的FreeMarker管理器。該屬性的默認值是org.apache.struts2.views.freemarker.FreemarkerManager,這是Struts 2內建的FreeMarker管理器。
—  struts.freemarker.wrapper.altMap:該屬性只支持true和false兩個屬性值,默認值是true。通常無需修改該屬性值。
—  struts.xslt.nocache:該屬性指定XSLT Result是否使用樣式表緩存。當應用處於開發階段時,該屬性通常被設置爲true;當應用處於產品使用階段時,該屬性通常被設置爲false。
—  struts.configuration.files:該屬性指定Struts 2框架默認加載的配置文件,如果需要指定默認加載多個配置文件,則多個配置文件的文件名之間以英文逗號(,)隔開。該屬性的默認值爲struts-default.xml,struts-plugin.xml,struts.xml,看到該屬性值,讀者應該明白爲什麼Struts 2框架默認加載struts.xml文件了。
在有些時候,開發者不喜歡使用額外的struts.properties文件,Struts 2允許在struts.xml文件中管理Struts 2屬性,在struts.xml文件中通過配置constant元素,一樣可以配置這些屬性。
struts.xml配置片段如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 指定Struts 2的DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
                                 <!-- 通過constant元素配置Struts 2的屬性 -->
                                  <constant name=" struts.custom.i18n.resources " value="mess" />
                                 ...
</struts>
上面代碼片段配置了一個常用屬性:struts.custom.i18n.resources,該屬性指定了應用所需的國際化資源文件的baseName爲mess。
 提示  Struts 2提供了兩種方式來管理Struts 2的屬性:既可以通過struts.properties文件來配置Struts 2屬性,也可通過在struts.xml文件中配置constant元素來配置Struts 2屬性。
3.5.4  struts.xml文件結構
struts.xml文件是整個Struts 2框架的核心,下面提供了一個最完整的struts.xml文件,這個文件沒有任何實際意義,僅僅是一個struts.xml文件示範。
<?xml version="1.0" encoding="GBK"?>
<!-- 下面指定Struts 2配置文件的DTD信息 -->
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<!-- struts是Struts 2配置文件的根元素 -->
<struts>
                                 <!-- 下面元素可以出現0次,也可以無限多次 -->
                                 <constant name="" value="" />
                                 <!-- 下面元素可以出現0次,也可以無限多次 -->
                                 <bean type="" name="" class="" scope="" static="" optional="" />
                                 <!-- 下面元素可以出現0次,也可以無限多次 -->
                                 <include file="" />
                                 <!-- package元素是Struts配置文件的核心,該元素可以出現0次,或者無限多次 -->
                                 <package name="必填的包名" extends="" namespace="" abstract=""
                                    externalReferenceResolver>
                                    <!-- 該元素可以出現,也可以不出現,最多出現一次 -->
                                    <result-types>
                                        <!-- 該元素必須出現,可以出現無限多次-->
                                        <result-type name="" class="" default="true|false">
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </result-type>
                                    </result-types>
                                    <!-- 該元素可以出現,也可以不出現,最多出現一次 -->
                                    <interceptors>
                                        <!-- 該元素的interceptor元素和interceptor-stack至少出現其中之一,
                                        也可以二者都出現 -->
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <interceptor name="" class="">
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </interceptor>
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <interceptor-stack name="">
                                            <!-- 該元素必須出現,可以出現無限多次-->
                                            <interceptor-ref name="">
                                                <!-- 下面元素可以出現0次,也可以無限多次 -->
                                                <param name="參數名">參數值</param>*
                                            </interceptor-ref>
                                        </interceptor-stack>
                                    </interceptors>
                                    <!-- 下面元素可以出現0次,也可以無限多次 -->
                                    <default-interceptor-ref name="">
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <param name="參數名">參數值</param>
                                    </default-interceptor-ref>
                                    <!-- 下面元素可以出現0次,也可以無限多次 -->
                                    <default-action-ref name="">
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <param name="參數名">參數值</param>*
                                    </default-action-ref>?
                                    <!-- 下面元素可以出現0次,也可以無限多次 -->
                                    <global-results>
                                        <!-- 該元素必須出現,可以出現無限多次-->
                                        <result name="" type="">
                                            <!-- 該字符串內容可以出現0次或多次 -->
                                            映射資源
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </result>
                                    </global-results>
                                    <!-- 下面元素可以出現0次,也可以無限多次 -->
                                    <global-exception-mappings>
                                        <!-- 該元素必須出現,可以出現無限多次-->
                                        <exception-mapping name="" exception="" result="">
                                            異常處理資源
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </exception-mapping>
                                    </global-exception-mappings>
                                    <action name="" class="" method="" converter="">
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <param name="參數名">參數值</param>*
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <result name="" type="">
                                            映射資源
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </result>
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <interceptor-ref name="">
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </interceptor-ref>
                                        <!-- 下面元素可以出現0次,也可以無限多次 -->
                                        <exception-mapping name="" exception="" result="">
                                            異常處理資源
                                            <!-- 下面元素可以出現0次,也可以無限多次 -->
                                            <param name="參數名">參數值</param>*
                                        </exception-mapping>
                                    </action>
                                 </package>*
<struts>
上面的struts.xml配置文件是一個非常全面的配置文件,包含了Struts 2的全部配置元素。上面配置文件主要用於幫助對XML DTD不太熟悉的讀者。
實際上,如果讀者需要熟悉XML文件的DTD(元素類型定義)語法,通過查看Struts 2配置文件的DTD信息,同樣可以瞭解Struts 2配置文件的結構。下面是Struts 2配置文件的DTD文件代碼。
<!--
   Struts configuration DTD.
   Use the following DOCTYPE
   
   <!DOCTYPE struts PUBLIC 
                                 "-//Apache Software Foundation//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 package
    name CDATA #REQUIRED
    extends CDATA #IMPLIED
    namespace CDATA #IMPLIED
    abstract CDATA #IMPLIED
    externalReferenceResolver NMTOKEN #IMPLIED

<!ELEMENT result-types (result-type+)>
<!ELEMENT result-type (param*)>
<!ATTLIST result-type
    name CDATA #REQUIRED
    class CDATA #REQUIRED
    default (true|false) "false"

<!ELEMENT interceptors (interceptor|interceptor-stack)+>
<!ELEMENT interceptor (param*)>
<!ATTLIST interceptor
    name CDATA #REQUIRED
    class CDATA #REQUIRED

<!ELEMENT interceptor-stack (interceptor-ref+)>
<!ATTLIST interceptor-stack
    name CDATA #REQUIRED

<!ELEMENT interceptor-ref (param*)>
<!ATTLIST interceptor-ref
    name CDATA #REQUIRED

<!ELEMENT default-interceptor-ref (param*)>
<!ATTLIST default-interceptor-ref
    name CDATA #REQUIRED

<!ELEMENT default-action-ref (param*)>
<!ATTLIST default-action-ref
    name CDATA #REQUIRED

<!ELEMENT global-results (result+)>
<!ELEMENT global-exception-mappings (exception-mapping+)>
<!ELEMENT action (param|result|interceptor-ref|exception-mapping)*>
<!ATTLIST action
    name CDATA #REQUIRED
    class CDATA #IMPLIED
    method CDATA #IMPLIED
    converter CDATA #IMPLIED

<!ELEMENT param (#PCDATA)>
<!ATTLIST param
    name CDATA #REQUIRED

<!ELEMENT result (#PCDATA|param)*>
<!ATTLIST result
    name CDATA #IMPLIED
    type CDATA #IMPLIED

<!ELEMENT exception-mapping (#PCDATA|param)*>
<!ATTLIST exception-mapping
    name CDATA #IMPLIED
    exception CDATA #REQUIRED
    result CDATA #REQUIRED

<!ELEMENT include (#PCDATA)>
<!ATTLIST include
    file CDATA #REQUIRED

<!ELEMENT bean (#PCDATA)>
<!ATTLIST bean
    type CDATA #IMPLIED
    name CDATA #IMPLIED
    class CDATA #REQUIRED
    scope CDATA #IMPLIED
    static CDATA #IMPLIED
    optional CDATA #IMPLIED

<!ELEMENT constant (#PCDATA)>
<!ATTLIST constant
    name CDATA #REQUIRED
    value CDATA #REQUIRED 

通過上面給出的struts.xml配置文件範例,以及Struts 2配置文件的DTD信息,我們已經可以全面掌握Struts 2配置文件的文件結構了,但struts.xml文件各配置元素的意義、各屬性的相關含義依然不能深入瞭解。關於Struts 2配置文件各元素及各屬性將在下一章深入介紹。
3.6  本章小結
因爲Struts 2是以Struts 1和WebWork爲基礎的,故本章大致介紹了Struts 1和WebWork框架的MVC實現,並在此基礎上側重於介紹Struts 1和WebWork與Struts 2的延續性,以及Struts 2框架與Struts 1和WebWork的類似性。通過閱讀本章,讀者應該明白:Struts 2是通過WebWork發展起來的,而不是通過Struts 1發展起來的。
本章還介紹瞭如何通過Eclipse IDE工具來開發Struts 2應用,Struts 2的配置文件,以及通過web.xml文件加載Struts 2框架。詳細介紹了struts.properties文件,以及struts.xml配置文件的結構。關於深入配置struts.xml文件的元素,則放在下一章介紹。


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