Struts框架中的視圖組件主要包括:
·JSP頁面
·ActionForm類
·Struts自定義標記
·消息資源
其中,ActionForm類是Struts框架的核心組件之一,是Struts的關鍵視圖組件。
1.ActionForm的作用機理
ActionForm本質上是一種JavaBean,是專門用來傳遞數據的DTO(Data Transfer Object,數據傳遞對象)。它包括用于表單數據驗證的validate()方法和用于數據復位的reset()方法。
Struts框架利用ActionForm對象來臨時存放視圖頁面中的表單數據。例如一個登錄頁面會有一個用戶輸入框和一個密碼輸入框,以及用來提交登錄請求的按鈕。當用戶提交登錄請求后,Struts將用戶名和密碼兩個輸入域的數據自動填充到相應的ActionForm對象中,然后控制層可以從該ActionForm對象中讀取用戶輸入的表單數據,也可以把來自模型層的數據存放到ActionForm中,然后返回給視圖顯示。
ActionForm有請求(request)和會話(session)兩種作用域(scope)。如果ActionForm的作用域設定為request,ActionForm實例將保存在request對象中,像其他保存在request對象中的屬性一樣,僅在當前的請求/響應范圍內有效。如果ActionForm的作用域設定為session,那么ActionForm實例將被保存在session對象中,同一個ActionForm實例在整個HTTP會話中有效。
當驗證ActionForm時,如果檢測到一個或多個驗證錯誤,Struts框架會把錯誤轉發回配置文件struts-config.xml中<action>元素的input屬性所指定的輸入頁面。
2.ActionForm的使用方法
(1)創建ActionForm
可以通過擴展Struts軟件包的ActionForm類,來創建具體的ActionForm。Struts軟件包中的ActionForm類本身是一個抽象類,在擴展該類時,為每一個要從HTML表單中捕獲的輸入域定義一個屬性,使表單輸入域與ActionForm的屬性一一對應,以使ActionForm能夠捕獲需要的表單輸入。定義了具體的屬性,就可以覆寫validate()和reset()方法,來實現具體的ActionForm驗證規則和初始化方法。
(2)配置ActionForm
每創建一個ActionForm類,就需要在Struts的配置文件struts-config.xml中配置這個類,例如:
<form-beans>
<form-bean name="loginActionForm" type="login.loginActionForm" />
</form-beans>
<form-beans>元素用來指定全體ActionForm的配置,一個Struts應用所有的ActionForm的配置都要位于該元素標記內。<form-beans>元素的子元素<form-bean>用來配置一個具體的ActionForm類,每個<form-bean>元素對應的內容為一個form bean實例。一旦定義了<form-beans>元素,就可以在Action中使用它。
(3)訪問ActionForm
ActionForm可以被JSP,Struts自定義標記,Action或其他Web組件訪問。訪問ActionForm的一般方法如下:
·使用Struts HTML標記庫
Struts HTML標記庫提供了一組和ActionForm密切關聯的標記,這些標記對應到HTML表單域。如<html:form>標記對應HTML的<form>標記,<html:text>標記對應HTML表單的text類型<input>輸入域。這些標記和ActionForm交互,以把ActionForm中的屬性值顯示出來。
·從request或session對象中取出ActionForm對象
根據作用域的不同,Struts框架把ActionForm實例保存在request或session對象中,保存時采用的key值為<form-bean>元素的名字,即name屬性的值。因此,可以像取出任何存放在request或session對象中的屬性一樣取出ActionForm實例。例如:
loginActionForm form=(loginActionForm)request.getAttribute("loginActionForm");
·在Action類的execute()方法中直接訪問ActionForm
如果配置了ActionForm和Action映射,Struts框架就會把ActionForm作為參數傳遞給Action類的execute()方法,在execute()方法中,可以直接讀取或設置ActionForm屬性。
3.表單數據驗證
表單驗證是ActionForm的主要功能之一,要實現這個功能,我們需要采取4個步驟:
·重寫validate()方法。
·在資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識。
·要在配置文件struts-config.xml中,把<action>元素的validate屬性設置為true,并添加<message-resources>元素以指明資源文件的存放路徑。
·在相應輸入頁面的相應位置加如錯誤標記<html:errors>,以輸出可能的驗證錯誤。
(1)重寫validate()方法
對該form bean的validatet()方法進行重寫。ActionErrors類封裝了一組驗證錯誤,它的用法類似Map類。而ActionMessage類封裝了單個驗證錯誤,它的構造函數內的參數就指向資源文件內的一個錯誤文本。例如語句“ActionMessage("login.password.error");”中的參數"login.password.error"其實就是資源文件ApplicationResources.properties中的一條錯誤文本的鍵(key)。通過ActionErrors對象的add()方法,可以把ActionMessage對象加入到ActionErrors對象中。
(2)設置資源文件
在Struts的資源文件ApplicationResources.properties中設置可能的驗證錯誤的標識:
#用戶名錯誤
error.username.required=<li>Please input your username again!</li>
#密碼錯誤
error.password.required=<li>Please input your password again!</li>
(3)修改配置文件struts-config.xml
將配置文件struts-config.xml中<action>元素的validate屬性設定為true。此外,還需要增加<message-resource>元素,以指明資源文件的路徑。
(4)在輸入頁面中加入錯誤標記
表單數據驗證的目的是,一旦用戶在輸入頁面表單中輸入的數據不符合要求或出現錯誤,Struts驗證機制將把驗證錯誤在該輸入頁面相應的位置顯示出來。
<html:errors>是Struts的一個自定義標記。它能根據它的property屬性從資源文件ApplicationResources.properties中取出相應的驗證錯誤,并在輸入頁面中指定的位置顯示驗證錯誤。