<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的Blog我做主^_^

    走向一條通往JAVA的不歸路...

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      64 隨筆 :: 68 文章 :: 77 評論 :: 0 Trackbacks

    Validator 檢查你的表單

    作者: James Holmes

    Validator (驗證器)提供的豐富的內置驗證方法簡化 Struts 的開發過程。

    ??????Struts 框架的一個主要好處是它提供了對接收到的表單數據進行驗證的內置界面。如果有任何驗證失敗,則應用程序都會重新顯示 HTML 表單,這樣就可以改正無效的數據了。如果驗證成功,則處理過程會繼續進行。 Struts 框架的簡單驗證界面會減少與處理數據驗證有關的令人頭疼的事情,這樣你就可以把精力集中到驗證代碼上,而不是放到捕獲數據、重新顯示不完整或無效數據的技巧上。

    但是, Struts 內置的驗證界面也有缺點。例如,在整個應用程序中驗證代碼常常會大量重復,因為許多域需要相同的驗證邏輯。對一些相似字段的驗證邏輯進行任何修改都要求在幾個地方修改代碼,還要重新編譯受影響的代碼。為了解決這個問題并增強 Struts 驗證界面的功能,作為 Struts 的第三方附加件創建了 Validator 框架。后來, Validator 被集成到核心 Struts 代碼庫中,并從 Struts 中分離出來,現在它是一個獨立的 Jakarta Commons 項目。雖然 Validator 是一個獨立的框架,但它仍能與其他程序封裝在一起后提供,并與 Struts 無縫集成。


    Validator
    概述

    ??????沒有 Validator ,你就不得不編寫驗證表單數據所需的全部代碼,并把它放入 Form Bean 對象的 validate( ) 方法中。對于想在其上進行數據驗證的每個 Form Bean 域來說,都需要編寫邏輯代碼來實現驗證。此外,你還必須編寫代碼來存儲驗證失敗時的出錯消息。

    有了 Validator ,你就不必在 Form Bean 中編寫用于驗證或存儲錯誤消息的任何代碼。相反, Form Bean 提供了 Validator 的一個 ActionForm 子類,它提供驗證或存儲錯誤消息的功能。

    可把 Validator 框架作為一個可用于 Form Bean 驗證的可插入的驗證例行程序系統來進行安裝。每個驗證例行程序都只是一個 Java 方法,負責執行特定類型的驗證任務,驗證可能通過,也可能失敗。 默認情況下, Validator 與幾個有用的驗證例行程序封裝在一起來提供,這些例行程序能滿足大多數情況下的驗證要求。但是,如果 Validator 框架沒有提供你需要的驗證例行程序,那么你可以自己創建定制的驗證例行程序,并將它插入到該框架中。此外, Validator 還支持服務器端和客戶端( JavaScript )的驗證,而 Form Bean 只提供服務器端驗證界面。

    Validator 使用兩個 XML 配置文件來分別確定安裝哪個驗證例行程序和如何將它們應用于給定的應用程序。第一個配置文件 validator-rules.xml 說明應該被插入到框架中的驗證例行程序,并提供每個驗證的邏輯的名稱。 validator-rules.xml 文件還定義了每個驗證例行程序的客戶端 JavaScript 代碼。可以配置 Validator 讓它把這個 JavaScript 代碼發送到瀏覽器上,這樣驗證就可以在客戶端和服務器端進行了。

    第二個配置文件 validation.xml 確定哪個驗證例行程序應用到哪個 Form Bean 。文件中的定義使用 struts-config.xml 文件給出的 Form Bean 的邏輯名稱以及 validator-rules.xml 文件給出的驗證例行程序的邏輯名稱,以便把二者關聯起來。

    使用 Validator 框架包括啟用 Validator 插件、配置 Validator 的兩個配置文件,以及創建提供 Validator ActionForm 子類的 Form Beans 。下面詳細解釋如何配置和使用 Validator


    啟用
    Validator 插件

    ??????雖然 Validator 框架是與 Struts 封裝在一起提供的,但在默認狀況下 Validator 并不被啟用。為了啟用 Validator ,要向你的應用程序的 struts-config.xml 文件中添加下面的插件定義。

    <!-- Validator Configuration -->

    <plug-in className="org.apache.struts

    .validator.ValidatorPlugIn">

    ? <set-property property="pathnames"

    ?????????????? value="/WEB-INF/

    ? validator-rules.xml, /WEB-INF/

    ?

    ? validation.xml"/>

    </plug-in>

    該定義告訴 Struts 為你的應用程序加載并初始化 Validator 插件。在初始化時,該插件裝入由路徑名屬性指定的、用逗號分隔的 Validator 配置文件清單。每個配置文件的路徑應該用與 Web 應用程序的相關的路徑來指定,如前面的例子所示。

    請注意,你的應用程序的 struts-config.xml 文件必須與 Struts Configuration Document Type Definition Struts 配置文檔類型定義, DTD )一致,后者規定文件中元素出現的順序。所以,你必須把 Validator 插件定義放到該文件的適當位置。確保文件中元素適當排列的最簡便方法就是使用諸如 Struts Console 的工具,它自動格式化你的配置文件,以便與 DTD 保持一致。


    配置
    validator-rules.xml

    ??????Validator 框架可以設置為可插入系統,其驗證例行程序僅僅是插入到該系統中執行具體驗證的 Java 方法。 validator-rules.xml 文件說明性地插入 Validator 用于執行驗證的驗證例行程序中。 Struts 示例應用程序帶有這個文件的預配置拷貝。在大多數情況下,你不必修改這個預配置拷貝,除非你要向該框架中添加自己定制的驗證。

    清單 1 是一個示例 validator-rules.xml 文件,說明如何將驗證例行程序插入到 Validator 中。 validator-rules.xml 文件中的每個驗證例行程序都有自己的定義,它用 validator 標記聲明,利用 name 屬性為該驗證例行程序指定邏輯名,并指定該例行程序的類和方法。該例行程序的邏輯名稱供該文件中的其他例行程序以及 validation.xml 文件中的驗證定義用于引用該例行程序。

    請注意, validator 標記放在 javascript 的標記中, javascript 標記用于定義客戶端 JavaScript 代碼,以便在客戶端執行與服務器端相同的驗證。


    提供的驗證程序

    ?????默認情況下, Validator 中包括幾個基本驗證例行程序,你可以用它們來處理大多數驗證問題。這些例行程序具有邏輯名稱,如 required (用于輸入要求的值)、 CreditCard (用于輸入信用卡號碼值)、 email (用于輸入電子郵件地址值),等等。


    創建
    Form Bean

    ?????為了使用 Validator ,你的應用程序的 Form Bean 必須歸到 Validator ActionForm 的某一子類,而不是 ActionForm 本身。 Validator ActionForm 子類提供了 ActionForm validate( ) 方法(它嵌入到 Validator 框架中)的實施過程。你不必從頭編寫驗證代碼并把它投入 validate( ) 方法中,相反,可以完全忽略該方法,因為 Validator 為你提供了驗證代碼。

    Struts 提供的核心功能相類似, Validator 提供給你兩種可供選擇的方法來創建 Form Bean 你可以選擇的第一種方法就是像下面這樣創建一個特定的 Form Bean 對象:

    package com.jamesholmes.minihr;

    ?

    import org.apache.struts.validator

    .ValidatorForm;

    ?

    ?

    public class LogonForm extends ValidatorForm {

    ? private String username;

    ? private String password;

    ?

    ? public String getUsername() {

    ??? return username;

    ? }

    ?

    ? public void setUsername(String

    username) {

    ??? this.username = username;

    ? }

    ?

    ?

    ? public String getPassword() {

    ??? return password;

    ? }

    public void setPassword(String

    password) {

    ??? this.password = password;

    ? }

    }

    這個類與你不是用 Validator 所創建的類相似,但它提供 ValidatorForm 而不是 ActionForm 。這個類也不提供 ActionForm 的空 reset( ) validate( ) 方法的實施過程,因為 ValidatorForm 提供了相應過程。

    struts-config.xml 文件中配置這個特定 Form Bean 的方法與配置正則 Form Bean 的方法相同:

    <form-beans>

    ? <form-bean name="logonForm"

    ??????????? type="com.jamesholmes

    ? .minihr.LogonForm"/>

    </form-beans>

    用表單標記的 name 屬性給特定 Form Bean 指定的邏輯名是在定義 validation.xml 文件中的驗證時所使用的名稱,如下所示:

    <!DOCTYPE form-validation

    PUBLIC "-//Apache Software Foundation//

    ?????? DTD Commons Validator Rules

    ?????? Configuration 1.0//EN"

    ?????? "http://jakarta.apache.org/

    ????? commons/dtds/validator_1_0.dtd">

    ?

    ?

    <form-validation>

    ? <formset>

    ??? <form name="logonForm">

    ????? <field property="username"

    ??????????? depends="required">

    ??????? <arg0 key="prompt.username"/>

    ????? </field>

    ??? </form>

    ? </formset>

    </form-validation>

    Validator 使用該表單標記的 name 屬性的值將驗證定義與要應用這些定義的 Form Bean 的名稱相匹配。

    創建 Form Bean 時可以選擇的第二種方法是在 struts-config.xml 文件中定義一個動態 Form Bean ,如下所示:

    <form-beans>

    ? <form-bean name="logonForm"

    ??????????? type="org.apache

    .struts.validator.DynaValidatorForm">

    ??? <form-property name="username"

    ??????????? type="java.lang.String"/>

    ??? <form-property name="password"

    ??????????? type="java.lang.String"/>

    ? </form-bean>

    </form-beans>

    動態 Form Bean 不要求創建特定的 Form Bean 對象;相反,要定義 Form Bean 應該具有的屬性和類型,而 Struts 為你動態創建 Form Bean Validator 允許你使用這個概念,就像在核心 Struts 中使用這個概念一樣。與使用 Validator 的惟一區別就是要指定 Form Bean org.apache.struts.validator.DynaValidatorForm 類型,而不是 org.apache.struts.action.DynaActionForm 類型。

    分配給動態 Form Bean 的邏輯名是在定義 validation.xml 文件中的驗證時使用的名稱。 Validator 使用與之相匹配的名稱將這些驗證與 Form Bean 聯系在一起。

    除了創建 Form Bean 的這兩種標準方法之外, Validator 還提供了一個高級特性,用于將多個驗證定義與一個 Form Bean 定義聯系起來。當你使用基于 validatorForm 或基于 DynaValidatorForm Form Bean 時, Validator 使用 struts-config.xml 文件中的 Form Bean 的邏輯名稱,將 Form Bean 映射到 validation.xml 文件中的驗證定義。這種機制在大多數情況下非常有用,但在某些時候, Form Bean 要在多個操作中共享。 一個操作可能使用 Form Bean 的所有域( fields ),而另一個操作可能只使用這些域的一個子集。因為驗證定義被連接到 Form Bean ,所以只使用域的一個子集的操作就無法繞過對未使用域的驗證。當驗證 Form Bean 時,就會對未使用的域生成錯誤消息,因為 Validator 無從知道不去驗證未使用的域,它只是簡單地把它們看作缺失或無效。

    為了解決這個問題, Validator 提供了兩個附加的 ActionForm 子類,它使你能夠將驗證與操作相關聯,而不是與 Form Bean 相關聯。這樣你就可以根據哪個操作正在使用 Form Bean 來指定把哪些驗證用于該 Form Bean 了。對于特定的 Form Bean ,你要像下面這樣聲明 org.apache.struts.validator.ValidatorActionForm 子類:

    public class AddressForm extends ValidatorActionForm {

    ? ...

    }

    對于動態 Form Bean ,在 struts-config.xml 文件中為 Form Bean 定義指定 org.apache.struts.validator.DynaValidatorActionForm 的類型,如下所示:

    <form-bean name="addressForm"

    ????????? type="org.apache.struts

    .validator.DynaValidatorActionForm">

    ? ...

    </form-bean>

    validation.xml 文件中,把一組驗證映射到一個操作路徑,而不是映射到 Form Bean 名,因為如果你定義了 Create Address Edit Address 兩個操作(它們使用同一個 Form Bean ),那么每個操作都會有一個惟一的操作名,如下所示:

    <action-mappings>

    ? <action path="/createAddress"

    ???????? type="com.jamesholmes

    ? .minihr.CreateAddressAction"

    ???????? name="addressForm"/>

    ? <action path="/editAddress"

    ???????? type="com.jamesholmes

    ? .minihr.EditAddressAction"

    ???????? name="addressForm"/>

    ?

    </action-mappings>

    下面的 validation.xml 文件片斷顯示了兩組驗證,它們用于同一個 Form Bean ,但卻有不同的操作路徑:

    <formset>

    ? <form name="/createAddress">

    ??? <field property="city"

    ????????? depends="required">

    ????? <arg0 key="prompt.city"/>

    ??? </field>

    ? </form>

    ? <form name="/editAddress">

    ??? <field property="state"

    ????????? depends="required">

    ????? <arg0 key="prompt.state"/>

    ??? </field>

    ? </form>

    </formset>

    因為 Form Bean 要么屬于 ValidatorActionForm 子類,要么屬于 DynaValidatorActionForm 子類,所以 Validator 知道用一個操作路徑代替 Form Bean 的邏輯名稱來找出用于 Form Bean 的驗證。


    配置
    validation.xml 文件

    ??????validation.xml 文件用于聲明將應用到 Form Beans 的一組驗證。要驗證的每個 Form Bean 在這個文件中都有自己的定義。在這個定義中,指定要應用到該 Form Bean 的各域的驗證。下面是一個 validation.xml 文件的例子,說明如何定義驗證:

    <!DOCTYPE form-validation

    PUBLIC "-//Apache Software Foundation//

    ?????? DTD Commons Validator Rules

    ?????? Configuration 1.0//EN"

    ?????? "http://jakarta.apache.org/

    ????? commons/dtds/validator_1_0.dtd">

    ?

    <form-validation>

    ? <formset>

    ??? <form name="logonForm">

    ????? <field property="username"

    ??????????? depends="required">

    ??????? <arg0 key="prompt.username"/>

    ?

    ??? ??</field>

    ????? <field property="password"

    ??????????? depends="required">

    ??????? <arg0 key="prompt.password"/>

    ????? </field>

    ??? </form>

    ? </formset>

    </form-validation>

    validation.xml 文件的第一個元素是 form-validation 。這個元素是該文件的主元素,而且只定義一次。在 form-validation 元素內定義 form-set 元素,它包括多個表單元素。一般來說,在文件中只定義一個 form-set 元素,但是如果要將驗證國際化,那就要在每個地方單獨使用一個 form-set 元素。

    每個表單元素使用 name 屬性將名稱與其所包含的域驗證集關聯起來。 Validator 使用這個邏輯名稱將這些驗證映射到在 struts-config.xml 文件中定義的一個 Form Bean 。根據要驗證的 Form Bean 的類型, Validator 力求將該名稱與 Form Bean 的邏輯名稱或操作路徑相匹配。在表單元素內, field 元素定義要應用到 Form Bean 的特定域的驗證。 field 元素的 property 屬性對應于特定 Form Bean 中的域名。 depends 屬性利用 validator-rules.xml 文件指定驗證例行程序的邏輯名稱,這些例行程序將應用到域驗證中。


    配置
    ApplicationResources.properties

    ??????Validator 使用 Struts 的資源綁定( Resource Bundle )機制將錯誤消息具體化。不用在框架中對錯誤消息進行硬編碼, Validator 使你能在 ApplicationResources.properties 文件中為一個消息指定一個鍵值,如果驗證失敗則將返回該鍵值。 validator-rules.xml 文件中的每個驗證例行程序都用 validator 標記的 msg 屬性指定錯誤消息的鍵值,如下所示:

    <validator name="required"

    ????????? classname="org.apache

    ?

    .struts.validator.FieldChecks"

    ????????? method="validateRequired"

    ????????? methodParams="java.lang

    .Object, org.apache.commons.validator

    .ValidatorAction, org.apache.commons

    .validator.Field, org.apache.struts

    .action.ActionErrors, javax.servlet

    .http.HttpServletRequest"

    ????????? msg="errors.required">

    如果在驗證例行程序運行時驗證失敗,則返回與 msg 屬性指定的鍵值對應的消息。

    下面的片段顯示來自 ApplicationResources.properties 文件的驗證出錯時的默認消息集,它們由 Struts 示例應用程序提供。每個消息的鍵值對應于每個由 validator-rules.xml 文件中的驗證例行程序所指定的消息,它們由 Struts 示例應用程序提供。

    # Error messages for Validator framework validations

    errors.required={0} is required.

    errors.minlength={0} cannot be less than {1} characters.

    errors.maxlength={0} cannot be greater than {2} characters.

    errors.invalid={0} is invalid.

    errors.byte={0} must be a byte.

    errors.short={0} must be a short.

    errors.integer={0} must be an integer.

    errors.long={0} must be a long.0.?? errors.float={0} must be a float.

    ?

    errors.double={0} must be a double.

    errors.date={0} is not a date.

    errors.range={0} is not in the range {1} through {2}.

    errors.creditcard={0} is not a valid credit card number.

    errors.email={0} is an invalid e-mail address.

    請注意,每條消息都有占位符,形式為 {0} {1} {2} 。在運行期間,占位符被另一個值代替,如所驗證的域的名稱。這一特性特別有用,它使你能夠創建可被幾個不同的域重復使用的通用驗證錯誤消息。

    例如,下面給出 required 驗證的錯誤消息 errors.required

    errors.required={0} is required.

    當你使用 validation.xml 文件中的該 required 驗證時,必須定義用于替換該錯誤消息中的 {0} 的值,如下所示:

    <form name="auctionForm">

    ? <field property="bid" depends="required">

    ??? <arg0 key="prompt.bid"/>

    ? </field>

    </form>

    錯誤消息最多可以有 4 個占位符: {0} {3} 。這些占位符分別稱為 arg0 arg3 ,你可以通過使用 arg0~arg3 標記來指定它們。在上面的例子中, arg0 標記指定了用于替換 {0} 占位符的值。該標記的 key 屬性指定來自 ApplicationResources.properties 文件的一個消息鍵值,它的值用于替換占位符,如下所示:

    下一步

    閱讀
    關于 Validator 的更多文章
    jakarta.apache.org/commons/validator

    關于 Struts Console 的更多文章
    www.jamesholmes.com/struts

    prompt.bid=Auction Bid

    使用消息鍵值代替占位符的值,這一方法使你不必在 validation.xml 文件中對替換值反復硬編碼。但是,如果你不想使用 Resource Bundle 的鍵值 / 值機制來指定占位符的值,則可以使用 arg0 標記的如下語法顯式地指定占位符的值:

    <arg0 key="Auction Bid" resource="false"/>

    在這個例子中, resource 屬性的值設為 false ,以便通知 Validator 要把該 key 屬性指定的值作為占位符的值,而不要作為 ApplicationResources.properties 文件中消息的一個鍵值。


    啟用客戶端驗證

    ??????Validator 除了提供了簡化服務器端表單數據驗證過程的框架外,它還提供了執行客戶端驗證時易于使用的方法。在 validator-rules.xml 文件中定義的每一個驗證例行程序都可以隨意指定 JavaScript 代碼,這些代碼可以在瀏覽器(客戶端上的)中運行,從而執行與服務器端進行的驗證相同的驗證過程。在客戶端進行驗證時,除非所有表單都通過驗證,否則這些表單不允許被提交。

    為了啟用客戶端驗證,必須在每個需要驗證的 JSP 中放上 Struts HTML Tag Library (標記庫)的 javascript 標記,如下所示:

    <html:javascript formName="logonForm"/>

    javascript 標記要求使用 formName 屬性來為想要對其執行驗證的表單指定 validation.xml 文件中給出的表單定義名,如下所示:

    <form name="logonForm">

    ? <field property="username"

    ??????? depends="required">

    ??? <arg0 key="prompt.username"/>

    ? </field>

    ? <field property="password"

    ??????? depends="required">

    ??? <arg0 key="prompt.password"/>

    ? </field>

    </form>

    為表單定義指定的服務器端的所有驗證都將在客戶端運行。由于客戶端驗證用 JavaScript 執行,所以可以有多種方法不去執行它。要確保驗證過程總是能運行,不論你是否選擇啟用了客戶端驗證, Validator 都在服務器端執行這些驗證。


    結論

    ??????Validator 框架針對表單數據的驗證提供了可配置的系統,從而為核心 Struts 框架添加了很多有價值的功能。通過把 Validator 框架用于你的應用程序,你可以節約時間并簡化 Struts 應用程序的開發過程。



    posted on 2007-01-10 01:07 java_蟈蟈 閱讀(280) 評論(0)  編輯  收藏 所屬分類: STRUTS
    主站蜘蛛池模板: 国产亚洲精品自在线观看| 亚洲黄色免费网址| 国产91久久久久久久免费| 拍拍拍又黄又爽无挡视频免费| 日本免费xxxx| 一级看片免费视频| 亚洲综合激情另类小说区| 免费日本黄色网址| 亚洲成人国产精品| 免费看片在线观看| 在线永久看片免费的视频| 成人性生交大片免费看中文| 在线免费观看h片| 久久青草免费91观看| 日日麻批免费40分钟无码| 理论秋霞在线看免费| 免费人妻精品一区二区三区| 亚洲香蕉久久一区二区| 在线综合亚洲欧洲综合网站| 亚洲伊人tv综合网色| 国产精品V亚洲精品V日韩精品| 18禁无遮挡无码网站免费| 美女黄网站人色视频免费国产| 四虎免费影院4hu永久免费| mm1313亚洲精品无码又大又粗| 免费a级毛片无码a∨蜜芽试看| 午夜毛片不卡高清免费| 免费人成网站在线播放| 成人激情免费视频| 亚洲裸男gv网站| 亚洲成a人片在线观看久| 久久综合亚洲色HEZYO国产| 亚洲国产成人久久精品影视| 国产成人精品亚洲日本在线| 精品久久久久久亚洲中文字幕| 亚洲国产成AV人天堂无码| 亚洲av永久中文无码精品综合 | 国产国产成年年人免费看片| 久久亚洲AV永久无码精品| 亚洲午夜久久影院| 亚洲1区2区3区精华液|