Struts 從零開始 五、Struts中驗證數據實例

五、Struts中驗證數據實例

一、Struts的ActionForm的表單驗證

ActionForm類用於在視圖層和控制層之間傳遞HTML表單數據。控制層可以從ActionForm Bean中讀取用戶輸入的表單數據,也可以把來自模型層的數據存放到ActionForm Bean中,然後把數據返回給視圖。即ActionForm Bean從HTML表單中獲取用戶輸入的數據並將傳遞給Action類,也可以把從業務層返回的數據用來填充ActionForm Bean,然後JSP頁面用它來爲HTML表單提供各種輸出字段的數據。此外,ActionForm Bean還具有表單驗證功能,可以過路不合法的數據。

ActionForm Bean有兩種存在範圍:request和session。如果ActionForm Bean存在於request範圍,它僅在當前的請求/響應生命週期中有效。如果ActionForm Bean存在於session範圍,同一個ActionForm Bean實例在整個HTTP會話中都有效。

在Struts框架中,使用ActionForm Bean來實現應用程序系統的非持久性數據存儲和維護功能,它採用了自動填充屬性和調用的機制。所以必須繼承ActionForm類,並且包涵用戶表單輸入的屬性,以及相應的get方法和set方法。另外,還可以根據需要重寫父類的reset()和validate()方法,實現屬性的重置和表單數據驗證功能。

? validate()方法

這個方法主要負責檢查數據的格式和語法,而不負責檢查數據是否符合業務邏輯。

ActionForm基類中的validate()方法在默認情況下將返回null。如果創建了ActionForm的子類,那麼應該在子類覆蓋validate()方法。

? reset()方法

這個方法用於恢復ActionForm Bean 的屬性的默認值。例如:把字符串屬性設爲null或某個初始值。

1、 修改前面我們寫的LoginActionForm,如果你不清楚的話,請您先看前幾個實例,具體代碼如下:

public ActionErrors validate(ActionMapping actionMapping,

HttpServletRequest httpServletRequest) {

ActionErrors errors = new ActionErrors();

if (username == null|| username.equals("")) {

errors.add(ActionErrors.GLOBAL_MESSAGE,

new ActionError("loginform.error.username"));

}

if (userpass == null||userpass.equals("")) {

errors.add(ActionErrors.GLOBAL_MESSAGE,

new ActionError("loginform.error.password"));

}

return errors;

}

這個方法返回ActionErrors對象,如果返回的ActionErrors對象爲null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證通過。如果ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,此時就回把請求轉發到你struts.xml裏面元素input屬性指定的web資源。

new ActionError("loginform.error.username");取得資源文件裏面的鍵值,用於頁面的輸出。

2、 打開applicationResource.properties,加入如下信息:

loginform.error.username=please enter your username

loginform.error.password=please enter your password

因爲我們前面做了國際化,所以打開applicationResource_zh_CN.properties文件,添加如下:

loginform.error.username=請輸入用戶名

loginform.error.password=請輸入密碼

3、 修改struts-config.xml文件


path="/login"

name="loginActionForm"

scope="request"

type="actions.LoginAction"

validate="true"

input="/login.jsp">







在元素中,name和scope屬性分別指定ActionForm的名字和它的範圍,valudate屬性指定是否執行表單驗證,而input屬性表示驗證失敗,所要顯示用戶的內容。

4、 修改login.jsp,在元素添加,目的是顯示錯誤信息,具體代碼片段如下:

















:用於輸出消息。屬性介紹如下:

n name:指定ActionMessages對象存放在request或session範圍內的屬性key。標籤處理類將根據這一屬性key來檢索request或session範圍的ActionMessages對象。

n message屬性:指定消息的來源。如果爲true,則從request或session範圍內檢索出屬性key爲Globals.MESSAGE_KEY的ActionMessages對象,此時name屬性無效;如果爲false,則根據name屬性來檢索ActionMessage對象,如果此時沒有設置name屬性,將採取默認值Globals.ERROR_KEY.message屬性的默認值爲false。

n id屬性:用來命名從消息中檢索出來的每個ActionMessage對象,它和標籤的name屬性匹配。

:表示顯示javaBean或其屬性的內容。

5、 運行

打開IE,鍵入如下地址:http://localhost:8080/Struts1_Login/login.jsp

不輸入任何東西,我們直接點幾擊“確定”,如下:




二、Struts的Validator驗證框架

Validator 目前是Jakarta Commons 項目的一部分,它也被包含在Struts主分發裏面,可以直接使用Struts 中自帶的Validator 庫,也可以去網站上下載http://jakarta.apache.org/commons/。

Struts框架能夠通過ActionForm Bean的validate()方法對用戶輸入的表單數據進行驗證。但是這種驗證方式又有一定的侷限性。必須由具體的代碼來實現驗證邏輯,如果驗證邏輯發生了改變,就需要重新編寫程序代碼。此外,如果系統中有多個ActionForm Bean,並且他們包含一些相同的驗證邏輯時,那麼開發人員必須對每個ActionForm Bean進行重複開發呢?

Validator框架能夠克服在ActionForm Bean中進行數據驗證的侷限性,它允許爲Struts應用靈活的配置驗證規則,無需編程。

Validator框架主要依賴於兩個JAR文件:

? Jakarta-oro.jar

提供了一組處理文本的類,具有文本替換,過錄和分割等功能。

? commons-validator.jar

提供了一個簡單、可擴展的驗證框架,包含了通用的驗證方法和驗證規則。

主要的Struts驗證組件

組件
說明

驗證器
處理原生和其它通用類型。基本驗證器包括required,mask(匹配正則表達式),minLength,maxLength,range,nativetypes, date,email,和creditCard。也可以定義定製 (或者插件) 驗證器。

資源文件
提供(本地化的)標註和消息。默認與Struts 共享消息資源。

XML 配置文件
根據需要定義針對字段的表單集和驗證。驗證器可以在一個單獨的文件中定義。

JSP 標籤
對給定的表單或Action 路徑產生JavaScript 驗證器。

ValidatorForm
根據FormBean 的名稱自動驗證屬性(在運行時通過ActionMapping 參數傳到validate 方法)。必須被擴展才能提供表單之上的期望屬性的驗證。

ValidatorActionForm
基於action 路徑自動驗證屬性(在運行時通過ActionMapping參數傳到validate 方法)。必須被擴展才能提供表單之上的期望屬性的驗證。


有些字段可能必須要求有數據輸入。而郵政編碼總是具有已知的長度。其它公共字段類型包括數值、日期、身份證號碼等等。

驗證器本身具有一些基本的驗證器來處理這些公共需要,當然還有其它一些需要。如果你的驗證不能被基本驗證器或者正則表達式滿足,你可以開發你自己的驗證器並插入到包中。基本驗證器支持其自身附帶的基本插件。

安裝和配置

Validator框架採用兩個基於XML的配置文件來配置驗證規則。一個是validator-rules.xml,另一個是validation.xml,這兩個文件應該部署在對應於WEB應用程序的WEB-INF文件夾下,對應的兩個jar文件也添加到WEB-INF/lib目錄下。

1、 validation-rules.xml

在validation-rules.xml 文件中配置了一些全局性的驗證規則,使得你在應用程序中使用校驗而不用關注實現細節。這個配置文件是Validator 框架自帶的,可以用在所有Struts應用中。它默認配置了許多很常用的規則,一般來說,不用去更改它,除非需要擴展或修改這些默認的驗證規則。

建議:即使你需要擴展一些規則,也不要去修改validation-rules.xml,而是通過新的配置文件去定義你所擴展的校驗規則。

validator-rules.xml文件的根元素是form-validation,它包含一到多個global元素,global元素包含一到多個validator 元素。

每一個validator 元素定義了一個唯一的驗證規則。下面是validation-rules.xml 文件中的一個片斷, (mask)驗證規則:


classname="org.apache.struts.validator.FieldChecks"

method="validateMask"

methodParams="java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field,

org.apache.struts.action.ActionMessages,

org.apache.commons.validator.Validator,

javax.servlet.http.HttpServletRequest"

depends=""

msg="errors.invalid"/>

1) name: 賦予驗證規則的一個唯一的名稱。

2) classname: 指的是具體實現驗證規則的類。

3) method: 指包含具體實現類的方法。
4) methodParams: 聲明method屬性所指定的方法參數,多個參數之間用逗號分隔。

5) depends: 指定在調用當前的嚴整規則之前必須先調用的其他驗證規則。多個則用逗號分隔。

6) msg: 指定來自於Resource Bundle中的消息key。當驗證失敗時,validator框架根據這個消息key到Resource Boundle中查找匹配的消息。

2、 validation.xml

Validator框架所需要的第二個配置文件是validation.xml,這個配置文件是具體應用(項目)所特定的,可以根據你的應用(項目)情況進行自定義配置。它描述了具體的ActionForm使用validation-rules.xml文件中的哪個驗證規則進行驗證。

一個自定義的驗證規則如下:

Validator.xml文件的根元素爲元素,它包含兩個子元素:和元素。

1)元素可以定義子元素,它用來定義常量表達式。

2)元素包含兩個子元素:和。

3)元素用於爲表單配置驗證規則,它的name屬性表示你驗證formBean,必須和struts-config.xml裏面FormBean名字保持一致。元素可以包含一個或多個子元素。

4)元素是針對表單中字段的驗證規則。Property屬性用於指定FormBean中需要驗證的字段的名稱,depends屬性用於指定字段的驗證規則,多個用逗號分隔。

5)元素表示出錯時的主體信息,key 是你屬性文件裏面的key。

6) 主要是對前面元素包含的驗證規則的定義。

3、插入Validator

每一個Struts應用需要知道是否使用了Validator框架,可以通過PlugIn(插件)機制將Validator框架配置到Struts應用中。

下面的代碼演示瞭如何將Validator 作爲一個插件加入到Struts 應用中,在Struts 應用的配置文件Struts-config.xml 中加入如下代碼片段:

value="/WEB-INF/validator-rules.xml,/WEB-INF/validator.xml"/>

pathnames屬性的值用來指定Validator 框架所使用的配置文件,多個配置文件之間用逗號分隔。

當應用啓動的時候,Struts框架將調用ValidatorPlugIn的init()方法。Validator框架的配置文件將會加載到內存中供應用使用。在init()方法被調用之前,pathnames所指定的值將會傳遞給ValidatorPlugIn的實例,ValidatorPlugIn實例將會依據這個值去加載配置文件。

案例說明:根據前面的例子我們進行進階,要求用戶輸入用戶名、密碼。並且用戶名、密碼是必須,若爲空,則提示錯誤信息。

A、服務器段驗證

1、修改FormBean

我們以前的是繼承ActionForm,現在改成ValidatorForm,導入相應的包,並刪除validator和reset方法。

2、修改struts-config.xml文件,具體代碼如下:


path="/login"

name="loginActionForm"

scope="request"

type="org.zhoudq.webapp.action.LoginAction"

validate="true"

input="/login.jsp">



將validator改爲true,告訴服務器對這個表單進行驗證,input的值,是告訴服務器如果嚴整失敗的話,將跳轉的頁面。

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