05 Struts2 配置檔案介紹
本章將帶你學習一個 Struts 2 應用程式必需的基本配置。在這裡,我們將看到一些重要的配置檔案:web.xml,struts.xml,struts-config.xml 和 struts.properties,它們將被配置。
1. web.xml 檔案
web.xml 配置檔案是一個 J2EE 的配置檔案,它決定如何用 servlet 容器來處理 HTTP 請求的元素。它不是嚴格意義上的一個 Struts 2 的配置檔案,但它是一個 Struts 2 工作時需要被配置的檔案。
如前所述,這個檔案為任何 web 應用程式提供了一個入口點。Struts 2 應用程式的入口點是一個在部署描述符(web.xml)中已定義的過濾器。因此,我們將在 web.xml 中定義 FilterDispatcher 類的入口。web.xml 檔案需要在 WebContent/WEB-INF
如果你在沒有生成配置檔案的模板或工具(如 Eclipse 或 Maven2)的幫助下開始,那麼 web.xml 是你需要配置的第一個配置檔案。下面是在我們最後一個例子中使用的 web.xml 檔案的內容。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注意
我們對映 Struts 2 的過濾器為 /* 而不是 */.action**,這意味著所有的 urls 將被 struts 的過濾器解析。當我們進入註解這一章時,我們將討論這個。
2. struts.xml 檔案
struts.xml 檔案包含配置資訊,隨著動作的開發,你將會修改這些配置資訊。這個檔案可以用來重寫應用程式的預設設定,例如 struts.devMode = false,還有定義在屬性檔案中的其他設定。這個檔案可以在資料夾 WEB-INF/classes 下建立。
讓我們來看看在前面的章節中已經解釋的 Hello World 例子中建立的 struts.xml 檔案。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="com.javaee.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
<-- more actions can be listed here -->
</package>
<-- more packages can be listed here -->
</struts>
要注意的第一件事是 DOCTYPE。所有的 struts 配置檔案需要有正確的 doctype,正如我們的小例子所示。 是根標籤的元素,在它的下面我們使用 標籤宣告不同的包。在這裡, 允許配置的分離和模組化。當你有一個大專案,並且該專案被劃分成不同的模組時,它是非常有用的。
也就是說,如果你的專案有三個域 - business_applicaiton,customer_application 和 staff_application,你可以建立三個包,並且在適當的包中儲存相關的動作。包標籤具有以下的屬性:
屬性 | 描述 |
---|---|
name (required) | 包的唯一識別符號。 |
extends | 這個包是由哪個包擴充套件的?預設情況下,我們使用 struts-default 作為基礎包。 |
abstract | 如果標記為 true,對於終端使用者消費來說,這個包是不可用的。 |
namesapce | 動作的唯一名稱空間。 |
帶著 name 和 value 屬性的常量標籤將被用於重寫任何 default.properties 中定義下面的屬性,就如我們剛剛設定 struts.devMode 屬性的過程。設定 struts.devMode 屬性允許我們在日誌檔案中看到更多的除錯資訊。
我們定義對應於每一個我們要訪問的 URL 的動作標籤,我們定義了一個帶有 execute() 方法的類,每當我們訪問相應的 URL 時,它將被訪問。
在動作被執行後,結果決定把得到的哪些返回給瀏覽器。從動作中返回的字串應該是一個結果的名稱。同上,每次執行動作,結果都被配置,或者都作為一個 “global” 的結果,包中的每個動作都是可用的。結果有可選的 name 和 type 屬性。預設名稱的值為 “success”。
隨著時間的推移,Struts.xml 檔案可以擴充套件,用包阻止它是一種使它模組化的方式,但是 struts 提供了另一種使 struts.xml 檔案模組化的方式。你可以將檔案分割成多個 xml 檔案,並且用下列的方式匯入它們。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</struts>
我們還沒有重寫的其他的配置檔案是 struts-default.xml。這個檔案包含了 Struts 的標準配置設定,你就不必要為了你的專案的 99.99% 修改這些設定。為此,我們不打算詳細地介紹這個檔案。如果你有興趣,可以在 struts2-core-2.2.3.jar 檔案中有效的 default.properties 檔案裡看到它。
3. struts-config.xml 檔案
struts-config.xml 配置檔案是在 Web 客戶端中檢視和模型元件之間的連結,但是你就不必要為了你的專案的 99.99% 而修改這些設定。基本配置檔案包含下面的主要內容:
序號 | 攔截器 & 描述 |
---|---|
1 | struts-config 它是配置檔案的根節點。 |
2 | form-beans 它是你把 ActionForm 子類對映到名稱上的位置。你使用這個名字作為 ActionForm 的別名,貫穿 struts-config.xml 的其餘部分,甚至在 JSP 頁面中。 |
3 | global forwards 這個部分把 web 應用的頁面對映到名稱上。你可以使用該名稱來引用實際的頁面。這個避免了在 web 頁面上硬編碼 URLs。 |
4 | action-mappings 它是你宣告表單處理程式的位置,他們也被稱為動作對映。 |
5 | controller 這個部分配置 Struts 內部,而且很少在實際情況中使用。 |
6 | plug-in 這個部分告訴 Struts 在哪裡找到包含提示和錯誤資訊的屬性檔案。 |
下面是示例 struts-config.xml 檔案:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name="login" type="test.struts.LoginForm" />
</form-beans>
<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>
<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action
path="/login"
type="test.struts.LoginAction" >
<forward name="valid" path="/jsp/MainMenu.jsp" />
<forward name="invalid" path="/jsp/LoginView.jsp" />
</action>
</action-mappings>
<!-- ========== Controller Definitions ======== -->
<controller
contentType="text/html;charset=UTF-8"
debug="3"
maxFileSize="1.618M"
locale="true"
nocache="true"/>
</struts-config>
關於 struts-config.xml 檔案更多的詳細資訊,請檢視你的 struts 文件。
4. struts.properties 檔案
這個配置檔案提供了一種改變框架的預設行為的機制。實際上,包含在** struts.properties** 配置檔案內的所有屬性也可以在 web.xml 中使用** init-param **被配置,同樣也可以在 struts.xml 配置檔案中使用 constant 標籤。但是如果你喜歡保持事情分離和有更多特定的 struts,你就可以在資料夾 WEB-INF/classes 下建立這個檔案。
在這個檔案中配置的值將重寫在** default.properties **中配置的預設值,default.properties 包含在 struts2-core-x.y.z.jar 分佈中。這裡有幾個屬性,你可能會考慮使用 **struts.properties **檔案改變它們
### When set to true, Struts will act much more friendly for developers
struts.devMode = true
### Enables reloading of internationalization files
struts.i18n.reload = true
### Enables reloading of XML configuration files
struts.configuration.xml.reload = true
### Sets the port that the server is run on
struts.url.http.port = 8080
在這裡,任何以井號(#)開始的行會被假定為註釋,它將被 Struts 2 忽略。