從一個高度層次來看,Strtsu2屬性pull-MVC(或是MVC2)框架;這與傳統(tǒng)的MVC框架略有不同,因為action的角色采用模型,而不是控制器,雖然這樣有一些重疊."pull"來自于視圖從action拉數(shù)據(jù),而不是持有一個分開的可用模型對象.

我們知道在概念方面意味著什么,但在執(zhí)行層面意味著什么?這個模型-視圖-控制器模式在Struts2中被實現(xiàn)成了五個核心部分--actions,攔截器,值棧/OGNL,結果類型和結果/視圖技術.

圖1:The MVC / Struts2 Architecture

圖1描述了從Struts2高度層面上的結構, 包含了模型,視圖和控制器.控制器是一個實現(xiàn)了Struts2里分派Servlet過濾器以及攔截器,模型實現(xiàn)的actions,視圖則是由結果類型和結果的組成.值棧和ONGL提供了一個通用的路線,鏈接和集成其他組件.

我們在這章討論一些通用的部分,將會有很多信息涉及到配置.配置WEB應用,配置actions,攔截器,結果等等.記住,這些說明只是為了提供如果完成的背景,或許不是最有效的配置應用的方式.在后面的章節(jié)我們將討論更加容易和更有效的方式以完成同樣的目標,使用約定俗成的配置,注釋和零配置插件.

在我們進入詳細講解核心構成之前我們先來討論一下全局的配置.

Configuration

在配置Struts2之前,你需要先下載發(fā)行版或是在你的Maven2的"pom.xml"文件中配置它的依賴關系:
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.0.6</version>
</dependency>
做完之后,Struts2應用的配置就可以分成三個獨立的文件,如圖2中所示.

Figure 2: Configuration file scope for framework elements

需要在你的"web.xml"文件里為WEB應用的配置FilterDispatcher Servlet過濾器:
1 <filter>
2     <filter-name>action2</filter-name>
3     <filter-class>
4         org.apache.struts2.dispatcher.FilterDispatcher
5     </filter-class>
6 </filter>
7 <filter-mapping>
8     <filter-name>action2</filter-name>
9     <url-pattern>/*</url-pattern>
10 </filter-mapping>
11
它配置了基本的WEB應用.剩下來的事就是使用"struts.properties"配置文件來自定義WEB應用的執(zhí)行環(huán)境,通過"struts.xml"配置文件來配置WEB應用的構件.我們現(xiàn)在來看看這兩個配置文件的詳細描述.

The struts.properties File

這個配置文件提供了一個改變框架默認行為的機制.一般情況下,你是不需要修改這個文件的,一個例外是你想配置一個對于開發(fā)者友好的調試環(huán)境.所有的包含在"struts.properties"配置文件中的配置項,都可以使用"init-param"標簽配置在"web.xml"文件中,同樣也可以使用"constant"標簽配置在"struts.xml"配置文件中.

Properties允許修改如改變Freemarker選項,替換action的映射類,決定是否重新加載XML配置文件,默認使用的用戶界面主題等等.更多的關于properties的最新信息,請查閱位于http://struts.apache.org/2.x/docs/strutsproperties.html的Struts2的Wiki.

一個默認的名為"default.properties"配置文件包含在發(fā)行版的Struts2-Core JAR文件中.想要修改一個配置項,只需在你項目的源文件的類路徑的根目錄里創(chuàng)建一個名為"struts.properties"的文件.之后,添加你想修改的配置項.新的值將覆蓋掉默認值.

在開發(fā)環(huán)境中,這有一些配置項你可能需要更改:

struts.i18n.reload = true -- 能夠重新加載國際化文件
struts.devMode = true -- 能夠在開發(fā)模式下提供更全面的調試
struts.configuration.xml.reload = true 能夠重新加載XML配置文件(適用于action),修改之后可以在Servlet容器里重新加載整個WEB應用
struts.url.http.prot = 8080 -- 設置服務運行的端口(以便生成正確的URL)
The struts.xml File

"struts.xml"文件包含配置信息,你將修改它用于發(fā)布action,我們將在本章剩余的部分詳細的講解指定的元素.現(xiàn)在,讓我們看看不會改變的結構.

注:
根據(jù)你應用的功能,可能會從你的應用中移除"struts.xml"文件.配置上我們將在本章討論一種替換的方法,使用注釋,"web.xml"啟動參數(shù),和交替的URL映射配置.
唯一的配置仍然需要"struts.xml"文件,如全局結果,異常處理,和自定義的攔截器棧.

這是一個XML文件,所以第一個元素是XML的版本和編碼信息.下一個則是XML的文檔類型定義(DTD).DTD提供了一些文件里的元素的結構,并最終用XML來解析和編輯.
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE struts PUBLIC
3     "-//Apache Software Foundation//DTD Struts Configuration
4     2.0//EN"
5     "http://struts.apache.org/dtds/struts-2.0.dtd">
6 <struts>
7     <package
8         name="struts2"
9         extends="struts-default"
10         namespace="/struts2">
11         …
12     </package>
13 </struts>
我們現(xiàn)在到達了<struts>標簽.這是Struts2具體配置的最外層標簽.所有其他的標簽都將被包含在這個當中.

The Include Tag:

<include ... />標簽用于將Struts2應用模塊化時引入其他配置文件時使用并且它始終是<struts>標簽的子標簽.它僅僅包含一個"file"屬性,用于提供被引入的文件的名稱,那個文件必須與"struts.xml"配置文件的結構相同.例如,如果你想拆分一個計費應用的配置文件,你可以選擇按組將繳費,管理和報表配置到單獨的文件中:
1 <struts>
2     <include file="billing-config.xml" />
3     <include file="admin-config.xml" />
4     <include file="reports-config.xml" />
5     …
6 </struts>
引入文件時,順序是重要的.來自引入文件的信息將在文件中引入標簽的位置開始有效.因此,使用一個配置在另一個文件中的標簽,這個引入的配置必須出現(xiàn)在被引用之前.

有一些文件你是必須明確的引入,還有一些文件是自動引入的.比如說"struts-default"和"struts-plugin.xml".兩者都包含了默認的結果類型,攔截器,攔截器棧,包,以及WEB應用執(zhí)行環(huán)境的配置信息(也可以配置在"struts.properties"文件中)的配置.區(qū)別在于"struts-default.xml"文件提供的是Struts2的核心配置,而"struts-plugin.xml"提供的是詳細插件的配置.每個插件JAR文件中都應包含一個"struts-plugin.xml"文件,所有這些都將在啟動的時候加載.