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

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

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

    posts - 495,comments - 227,trackbacks - 0

    作者:

    David Winterfeldt 大衛

    James Turner 詹姆斯

    Rob Leland 羅伯特

    翻譯:

    ?????? 侯思超

    驗證器:

    0.5 版,驗證器在一些 form 中就已經實現了,他最初包含在開發人員包中,后來核心代碼挪到 Jakarta Commons 包中和 Struts 特別擴展中作為 Struts 1.1 的一部分。許多開發者為方便一直使用 struts 驗證器,這篇文檔首先概述驗證器的核心功能性,然后大概介紹在 struts1.1 中的變化和新增功能。

    如果你配置好驗證器插件,你應該擴展 ValidatorForm 而不是 ActionForm ,以便它能加載你的 Validator 資源。他根據 struts-config.xml 文件中的 action name 屬性為當前 form 的調用相應的驗證器,因此在 validator-rules.xml 中的 form 元素的名稱屬性應該與 action name 屬性值相匹配。

    另外一種選擇是擴展 ValidatorActionForm 而不是 ValidatorForm ValidatorActionForm 使用 struts-config.xml action path 屬性,所以 path 屬性的值相應的應該與 validator-rules.xml 中的 Form name 屬性匹配。

    一個分離的 action 可以定義給多頁 form 的每個頁面,而且驗證規則可以與 action 關聯而不是與頁碼,就像驗證范例中的多頁 form 范例那樣。

    國際化

    validator-rules.xml 文件中 form 的驗證規則可以組織為 FormSet FormSet 有與 java.util.Locale 類相應的屬性:如語言 , 國家以及變量型屬性,如果他們未定義, FormSet 將把它設置為默認值。一個 FormSet 也可以有關聯的常量。另外還可以定義與 FormSet 同一級別的全局 global 元素,他與 FormSet 同樣也有常量。

    注意 :你必須在國際化的 FormSet 前聲明一個沒有國際化的默認 FormSet 。這樣如果 Validator 沒有找到 locale 時可以有一個默認版本。

    ?????? 可插入驗證器的默認錯誤信息值可以被 msg 元素覆蓋。所以為 mask 驗證器生成錯誤信息的替代方法就是使用 msg 屬性,如果字段的 name 屬性與驗證器的 name 屬性匹配,那末將使用字段的 msg 屬性。

    ?????? error messages 的可以設置 arg0-arg3 等參數元素。如果沒有設置 arg0-arg3 name 屬性, error messages 將使用他們作為默認的構建參數值。如果設置了 name 屬性,你就可以把參數指定給一特定的可插入驗證器,然后這些參數將在構造錯誤信息時被使用。

    <field

    property="lastName"

    depends="required,mask">

    <msg

    name="mask"

    key="registrationForm.lastname.maskmsg"/>

    <arg0 key="registrationForm.lastname.displayname"/>

    <var>

    <var-name>mask</var-name>

    <var-value>^[a-zA-Z]*$</var-value>

    </var>

    </field>

    默認的 arg0-arg3 元素將在消息資源中查找相應的 key ,如果資源屬性設為 false ,她將把值直接傳進去,而不從消息資源中查找。注意 1.1 版本中,你必須為每個模塊中明確地定義在驗證中用到的消息資源,否則將使用 top-level 資源。

    <field

    property="integer"

    depends="required,integer,intRange">

    <arg0 key="typeForm.integer.displayname"/>

    <arg1

    name="range"

    key="${var:min}"

    resource="false"/>

    <arg2

    name="range"

    key="${var:max}"

    resource="false"/>

    <var>

    <var-name>min</var-name>

    <var-value>10</var-value>

    </var>

    <var>

    <var-name>max</var-name>

    <var-value>20</var-value>

    </var>

    </field>

    常量 / 變量

    全局的常量可以在全局標簽中定義, FormSet/ 本地常量能在 formset 標簽中創建。常量當前僅僅是代替字段的 property 屬性,字段的 var 元素的 value 屬性,字段的 msg 元素的 key 屬性,字段的 arg0-arg3 元素的 key 屬性。字段的變量也可以在 arg0-arg3 元素中被代替(例如: ${var:min} ))。替換的順序是 FormSet/Locale 常量第一,全局的常量第二,

    arg elements 變量最后。

    <global>

    <constant>

    <constant-name>zip</constant-name>

    <constant-value>^\d{5}(-\d{4})?$</constant-value>

    </constant>

    </global>

    ?

    <field

    property="zip"

    depends="required,mask">

    <arg0 key="registrationForm.zippostal.displayname"/>

    <var>

    <var-name>mask</var-name>

    <var-value>${zip}</var-value>

    </var>

    </field>

    驗證器可以使用字段下面的變量部分來存儲變量,這些變量通過字段的 getVar (String key) 方法取得。

    <field

    property="integer"

    depends="required,integer,intRange">

    <arg0 key="typeForm.integer.displayname"/>

    <arg1

    name="range"

    key="${var:min}" resource="false"/>

    <arg2

    name="range"

    key="${var:max}" resource="false"/>

    <var>

    <var-name>min</var-name>

    <var-value>10</var-value>

    </var>

    <var>

    <var-name>max</var-name>

    <var-value>20</var-value>

    </var>

    </field>

    使用 validwhen 設計復雜的驗證

    使用 validwhen 來設計復雜驗證的一個經常的要求就是根據一個字段驗證另外一個字段(比如 , 如果你要用戶兩次輸入口令來確認值口令一致),另外一個就是表單中的一個字段只有另外一個字段有確定值的時候才是必須輸入的。新的 validwhen 驗證規則將很快被包含在 1.1 后的 STRUTS 版本中,她就是用來處理這種情況的。

    ?????? validwhen 規則處理單個的變量字段,叫測試。這變量的值是一個布爾的表達式,如果驗證有效則它必須為真。可以包含這種變量的表達式有:

    u?????? 單引號或雙引號字符串 literals

    u?????? 十進制、十六進制、八進制的 Integer literals

    u?????? null null 和空字符串匹配,

    u?????? 其它可以用屬性名引用的 form 字段 , 例如 customerAge

    u?????? 可以在外部因用得索引字段 , 例如 childLastName[2]

    u?????? 可以默認 implicit 因用得索引字段 , 例如 childLastName[], 她將作為被索引的字段使用同樣的索引到數組中,

    The literal * 這里指它包含當前測試字段的值,

    作為例子,考慮一個包含通訊地址和郵箱字段的 form 。如果通訊地址不為空則郵箱字段是必須的 required 。你能這樣定義 validwhen 規則:

    <field property="emailAddress" depends="validwhen">

    <arg0 key="userinfo.emailAddress.label"/>

    <var>

    <var-name>test</var-name>

    <var-value>((sendNewsletter == null) or (*this* != null))</var-value>

    </var>

    </field>

    上面定義的意思是:如果通訊地址是空或不空時這個字段時有效的。

    這里有個稍微復雜的例子,它使用了索引字段。假定有一個表單,允許用戶輸入他們希望定購的部件號和數量。類 orderLine bean 的一數組被用來在稱為 orderLines 的一屬性保持輸入項。

    If you wished to verify that every line with part number also had a quantity entered, you could do it with:

    如果你希望校驗訂單中有數量輸入得每一行,你可以這樣:

    <field

    property="quantity"

    indexedListProperty="orderLines"

    depends="validwhen">

    <arg0 key="orderform.quantity.label"/>

    <var>

    <var-name>test</var-name>

    <var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value>

    </var>

    </field>

    這里的意思是:如果相應的 partNumber 字段是空 , 或這字段是不空的,則這字段是有效的。

    最后一個例子,想象一表單,用戶必須輸入他們的以英寸為單位的高度,如果他們在高度在 60 英寸以下,則出一錯誤。( it is an error to have checked off nbaPointGuard as a career.

    <field property="nbaPointGuard" depends="validwhen">

    <arg0 key="careers.nbaPointGuard.label"/>

    <var>

    <var-name>test</var-name>

    <var-value>((heightInInches >= 60) or (*this* == null))</var-value>

    </var>

    </field>

    ?

    給程序員的簡單說明:

    所有的比較關系必須在 parens 封裝。 All comparisons must be enclosed in parens.

    只有兩個 itme 時可以 and or 鏈接。

    如果比較的兩 item 都可以轉為整數,則使用 numeric 比較,否則使用字符串比較。

    可插入驗證器

    驗證是從 validation.xml 文件中加載的,默認的驗證規則定義在 validation.xml 文件中,默認定義了 required, mask ,byte, short, int, long, float, double, date ( 沒有本地支持 ), and a numeric range

    " mask " 方式依賴于默認值安裝要求,那意味著 "required " 可以完成,在 "'mask " 將運行以前 "required " " mask " 方式被默認包含進框架中了。任何字段如果不是 "required " 而且是空或有零長度將跳過其他驗證。

    如果使用了 Javascript 標簽,客戶端 javascript validator's javascript 屬性中查找值而且產生一個有驗證 form 方法的對象,要得到更多的關于 Javascript Validator 標簽工作細節的詳細的解釋 , 參閱 html 標簽 API 參考。

    "'mask' " 方式讓你用一正則表達式掩碼驗證字段,它使用 jakarta 的正規表達式包,所有的有效性規則存儲在 validator-rules.xml 文件,使用的主類是 org.apache.regexp.RE

    validation.xml 文件中的驗證器配置范例:

    <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">

    <validator name="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.ActionErrors,

    javax.servlet.http.HttpServletRequest"

    msg="errors.invalid">

    ?

    定義可插入驗證器

    方法的參數是用逗號分隔的一些類名稱列表,方法屬性需要有一個符合上面的列表的簽名。列表由以下組合而成:

    java.lang.Object – 要驗證的 Bean

    org.apache.commons.validator.ValidatorAction – 當前 ValidatorAction

    org.apache.commons.validator.Field – 要驗證的字段

    org.apache.struts.action.ActionErrors – 如果驗證錯誤將加入 ActionError 的錯誤對象 javax.servlet.http.HttpServletRequest – 當前 request 對象。

    javax.servlet.ServletContext – 應用的 ServletContext

    org.apache.commons.validator.Validator– 當前的 org.apache.commons.validator.Validator 實例。

    java.util.Locale – 當前用戶的 Locale

    多頁面 form

    字段部分有一可選的頁面屬性,它可以被設為整數,頁上字段的所有驗證小于或等于服務器端驗證的當前頁,頁上字段的所有驗證小于或等于客戶端頁上所有字段的驗證小于或等于服務器端驗證的當前頁驗證的當前頁。一個 mutli-part 表單需要定義頁面屬性:

    <html:hidden property="page" value="1"/>

    比較兩個字段

    這是一個展示你怎樣才能比較兩個字段是否有一樣的值的例子。比如“用戶改變他們的口令“一般會有口令字段和一確認字段。

    <validator name="twofields"

    classname="com.mysite.StrutsValidator"

    method="validateTwoFields"

    msg="errors.twofields"/>

    <field property="password" depends="required,twofields">

    <arg0 key="typeForm.password.displayname"/>

    <var>

    <var-name>secondProperty</var-name>

    <var-value>password2</var-value>

    </var>

    </field>

    ?

    public static boolean validateTwoFields(

    Object bean, ValidatorAction va,?

    Field field, ActionErrors errors, HttpServletRequest request,?

    ServletContext application) {

    String value = ValidatorUtils.getValueAsString( bean,? field.getProperty());

    String sProperty2 = field.getVarValue("secondProperty");

    String value2 = ValidatorUtils.getValueAsString( bean,? sProperty2);

    ?

    ?????? if (!GenericValidator.isBlankOrNull(value)) {

    try {

    if (!value.equals(value2)) {

    errors.add(field.getKey(),

    Resources.getActionError( application, request, va, field));

    ???????????????????? ?????? return false;

    }

    } catch (Exception e) {

    errors.add(field.getKey(), Resources.getActionError( application, request, va, field));

    return false;

    }

    }

    }

    已知的 bug

    Struts Validator 依賴于 Commons Validator 包,所以問題報告和增強需求可能在兩個產品中列出。

    ·?? Struts Validator Bugzilla Reports

    ·?? Commons Validator Bugzilla Reports

    變更和 deprecations

    新建的標記屬性。

    <html:javascript> 標記有新的屬性定義 .

    使用 commons-validator.jar 中的 DTD 驗證。

    當前使用的驗證 XML 文件是根據 commons-validator.jar 中的 DTD Struts 不在為 validator-rules.xml and validator.xml. 單獨維護一個分離的 DTD ,另外 ,commons-validator 現在維護一個統一的 validator.dtd 。修改所有 validator.xml 文件的 DTD 引用為

    <!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">

    空字段。

    當前默認在所有得基礎驗證類型中忽略空白的字段,如果你要求一個字段必須輸入,那末在你的應用的 validator.xml 文件相應的字段定義的 depends 屬性中添加 " required "

    新建的范圍 RANGE 方法 .

    JavaScript JAVA 中都添加了 intRange & floatRange 方法。

    有條件地 REQUIRED 字段 .

    最大的修改是添加了基于其她字段的值的有條件地 require 驗證的能力。它允許你定義邏輯如:“只有 X 字段非空的時候 Y 字段為 ’male’ 才有效”,這是實現上述邏輯的推薦方法,這種方法在 1.1 版后的第一版將實現。在 1.1 版中添加的 Requiredif 驗證規則,將在新版中去掉。不過,如果你正準備使用 requiredif ,這里有一個簡短的教程。

    ?????? 讓我們假定你有一個有 3 個字段的醫藥的信息表單,性別 sex ,懷孕測試 pregnancyTest ,測試結果 testResult ,如果性別為 'f' or 'F' ,則懷孕測試 pregnancyTest required ,如果 pregnancyTest 不是空,測試結果 testResult required

    你的 validation.xml 文件的輸入項應該是這樣的:

    <form name="medicalStatusForm">

    <field property="pregnancyTest" depends="requiredif">

    <arg0 key="medicalStatusForm.pregnancyTest.label"/>

    <var>

    <var-name>field[0]</var-name>

    <var-value>sex</var-value>

    </var>

    <var>

    <var-name>fieldTest[0]</var-name>

    <var-value>EQUAL</var-value>

    </var>

    <var>

    <var-name>fieldValue[0]</var-name>

    <var-value>F</var-value>

    </var>

    <var>

    <var-name>field[1]</var-name>

    <var-value>sex</var-value>

    </var>

    <var>

    <var-name>fieldTest[1]</var-name>

    <var-value>EQUAL</var-value>

    </var>

    <var>

    <var-name>fieldValue[1]</var-name>

    <var-value>f</var-value>

    </var>

    <var>

    <var-name>fieldJoin</var-name>

    <var-value>OR</var-value>

    </var>

    </field>

    <field property="testResult" depends="requiredif">

    <arg0 key="medicalStatusForm.testResult.label"/>

    <var>

    <var-name>field[0]</var-name>

    <var-value>pregnancyTest</var-value>

    </var>

    <var>

    <var-name>fieldTest[0]</var-name>

    <var-value>NOTNULL</var-value>

    </var>

    </field>

    </form>

    ?

    這里有一個使用索引的屬性更復雜的例子,如果你的 struts-config.xml 有這下面:

    <form-bean name="dependentlistForm"

    type="org.apache.struts.webapp.validator.forms.ValidatorForm">

    <form-property

    name="dependents"

    type="org.apache.struts.webapp.validator.Dependent[]" size="10"/>

    <form-property name="insureDependents" type="java.lang.Boolean" initial="false"/>

    </form-bean>

    這里 dependentlistForm bean lastName firstName dob coverageType 四個屬性,你可以這樣定義一驗證規則:

    <form name="dependentlistForm">

    <field

    property="firstName" indexedListProperty="dependents" depends="requiredif">

    <arg0 key="dependentlistForm.firstName.label"/>

    <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

    </var>

    <var>

    <var-name>fieldIndexed[0]</var-name>

    <var-value>true</var-value>

    </var>

    <var>

    <var-name>fieldTest[0]</var-name>

    <var-value>NOTNULL</var-value>

    </var>

    </field>

    ?

    <field

    property="dob" indexedListProperty="dependents" depends="requiredif,date">

    <arg0 key="dependentlistForm.dob.label"/>

    <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

    </var>

    <var>

    <var-name>fieldIndexed[0]</var-name>

    <var-value>true</var-value>

    </var>

    <var>

    <var-name>fieldTest[0]</var-name>

    <var-value>NOTNULL</var-value>

    </var>

    </field>

    ?

    <field

    property="coverageType" indexedListProperty="dependents" depends="requiredif">

    <arg0 key="dependentlistForm.coverageType.label"/>

    <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

    </var>

    <var>

    <var-name>fieldIndexed[0]</var-name>

    <var-value>true</var-value>

    </var>

    <var>

    <var-name>fieldTest[0]</var-name>

    <var-value>NOTNULL</var-value>

    </var>

    <var>

    <var-name>field[1]</var-name>

    <var-value>insureDependents</var-value>

    </var>

    <var>

    <var-name>fieldTest[1]</var-name>

    <var-value>EQUAL</var-value>

    </var>

    <var>

    <var-name>fieldValue[1]</var-name>

    <var-value>true</var-value>

    </var>

    <var>

    <var-name>fieldJoin</var-name>

    <var-value>AND</var-value>

    </var>

    </field>

    </form>

    這里的意思是:

    如果 lastName 字段是非空的, firstName 字段 required 。因為字段 Indexed 為真,這它意味著 lastName indexed 必須與 firstName 的索引的一樣, dob 同理,除非 date 不為空。

    如果 lastName 用樣索引時的值不空 , 而且非索引字段 insureDependents 為真,則 coverageType only require

    你可以對字段在 [n] 中使用任意數字,唯一的限制是他們必須都是 AND OR, 你無法混合使用。

    Deprecation

    u?????? JavaScript Java range 方法 .

    u?????? StrutsValidator &StrutsValidatorUtil 類中的 Deprecation 方法

    驗證器 api 指南

    一個簡明的 Struts驗證器API指南 可以幫助你開始。

    驗證器資源

    Struts Validator: Validating Two Fields Match 作者Matt Raible。(兩個字段匹配驗證)關于使用方法的文章。(范例部分為翻譯此文內容)

    DynaForms and the Validator 作者James Turner and Kevin Bedell。 Struts Kickstart 的其中一章(動態form和驗證器),可以自由下載PDF).

    Validating user input 作者 David Winterfeldt and Ted Husted。 Struts in Action 的其中一章,可以自由下載(PDF)。


    使用方法

    作者:

    丑陋 && Snowtears :經過 2 周的不懈努力,閱讀了大量的資料,終于對 Validator 有了個初步的認識,整理了一下,淺淺的談了談寫法,希望能有一定的幫助,其中肯定有許多說的不對不準確的地方,還請多指教 real_herozx@163.net

    ?????? 王藝:

    ?????? 根據以上兩位的文章正理而成

    配置 ruts-config.xml

    1、 ??????????? 添加 ApplicationResources 配置文件。

    如:

    <!-- ========== Message Resources Definitions =========================== -->

    <message-resources parameter="com.dc.sibss.om.struts.ApplicationResources" />

    其中 com.sibss.om.struts.ApplicationResources" 的部分是 資源文件 的路徑,此文件的作用是提供錯誤信息的非編程定制化和多語言支持。如果我們使用中文平臺操作系統,則默認情況下將首先查找 ApplicationResource_zh_CN.properties 文件,然后是 ApplicationResources_zh.properties ,如果前兩個文件沒有被找到則將查找 ApplicationResources.properties 文件。

    為了能夠在頁面上顯示錯誤提示信息,我們還需要將以下內容添加到 ApplicationResources.properties 文件的末尾:

    ?????? ?????? 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 an byte.

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

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

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

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

    errors.double={0} must be an 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.

    以上僅是 struts 現在支持的錯誤類型的錯誤提示信息,如果你自定義了新類型的錯誤驗證,則還需要在此加上你自己的內容。

    以上內容中的 {0} 指的是錯誤提交的參數。比如:當你需要頁面上的“用戶名”不能為空時(也就是上面的 errors.required ),這個 {0} 就代表“用戶名”,所以如果你沒有填寫用戶名將拋出如下錯誤:

    ?????? 用戶名 is required. (你可以根據需要修改稱中文)

    我們可能已經注意到了,既然錯誤提示信息需要配置,那么上例中“用戶名”系統是如何得到的呢?沒錯!也是通過修改此配置文件,內容如下:

    ?????? visitCust.error.name.required=<br> 用戶名

    這樣當“用戶名”為空時, struts 后臺程序將聯合以上兩處定義顯示錯誤信息。

    另外,上面的“ visitCust.error.name.required ”是在 Validation.xml 配置驗證內容時指定的。 具體見以下介紹

    注意:一般情況下,你的系統只需要一個 ApplicationResources 文件,所以開發組的成員不要添加自己的 resource 文件。只有在你的項目分組開發時才需要使用多個 ApplicationResources 文件,但是,同時你的 struts-config.xml 文件也會有相同的數量對應。

    2、 ??????????? struts-config.xml 文件中加入 validator 插件:

    加入這個插件后你的應用就具備使用 Validator 的環境,如:

    <!-- ========== Plug Ins Configuration ================================== -->

    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    <set-property value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" property="pathnames" />

    </plug-in>

    這里如果是想使用多個 ***.xml 文件的話, value 部分寫法如下 value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml, /WEB-INF/validation1.xml , /WEB-INF/validation2.xml "

    <action-mappings> 里,定義需要驗證的畫面對應的 Action 的時候要加上 validate="true"

    四種使用方法

    1、 ??????????? Javascript 在客戶端進行驗證

    配置:在需要驗證的 JSP 文件中寫入

    <html:form action="/XXX" onsubmit="return validateXXXX(this);">

    這里的 XXX 是與要進行驗證的 forward name validateXXXX (this); 里面的 XXXX 是需要進行驗證的 ActionForm 名。

    <html:javascript formName="mytestForm"/>

    validation.xml 文件中寫入驗證代碼就可以進行基本的驗證了。這種方法是在客戶端進行驗證,客戶端可以看到 JAVASCRIPT 部分的全代碼。安全性不高

    2、 ??????????? ValidatorForm validate 方法

    1 validate ()方法: 使自己的 ActionForm 繼承 ValidatorForm 類,在里面編寫自己的方法:

    public ActionErrors validate (ActionMapping mapping,HttpServletRequest request) {

    ActionErrors errors = new ActionErrors();

    。。。。。。

    if ( mytext.equals("aaa") ) {

    //my exampleerrors.add("mytext",new ActionError("mytext.error"));

    }

    。。。。。。

    return errors;

    }

    此時,如果寫了這個方法,就會屏蔽掉在 Validation.xml 中定義的驗證部分,換句話說就是系統運行時, Validation.xml 里對應此 ActionForm 的定義的錯誤驗證部分不實行,如果不寫這個方法的話,系統運行時會進行 Validation.xml 里對應此 ActionForm 的定義的錯誤驗證部分的操作。此類方法是在服務器端進行驗證,驗證部分代碼客戶端不可見。

    2 、創建你的 ActionForm 并讓它繼承 org.apache.struts.validator.ValidatorForm 類。創建你的 Action 實現,并和上面定義的 ActionForm 關聯。這里需要注意的是,在定義此 Action 時一定將 validate 屬性設置為 true ,并且在你定義的 ActionForm 中不要實現它的 validate 方法――這就意味著你將使用 ValidatorForm validate 方法,這樣才能保證你的錯誤驗證正常進行。 配置 validation.xml 文件。基本內容如下:

    <form-validation>

    <!-- ========== Default Language Form Definitions ===================== -->

    ??? <formset>

    ?????? ?????? <form name="custGNewForm"> 需要驗證頁面上 form 的名字

    ????????????? ?????? <field property="certifiCode" 需要校驗的屬性

    ????????????? ????????????? ?????? depends="required,maxlength"> 校驗內容

    ????????????? ?????? ?????? <arg0 key="prompt.certifiCode"/>ApplicationResource 文件中對應

    ????????????? ?????? ?????? <arg1 key="${var:maxlength}" name="maxlength" resouce="false"/>

    ????????????? ?????? ?????? <var> 確定最長限制的長度

    ????????????? ????????????? ?????? <var-name>maxlength</var-name>

    ????????????? ????????????? ?????? <var-value>20</var-value>

    ????????????? ?????? ?????? </var>

    ????????????? ?????? </field>

    注意:此處的 arg0 arg1 就代表了 ApplicationResources 文件中使用“ {} ”括起來的參數。比如:

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

    定義了三個參數,所以你這里也要定義 <arg0> <arg1> <arg2> 三個參數才能完整的顯示錯誤信息。

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

    定義了 0 2 兩個參數,所以你就需要定義 <arg0> <arg2> 兩個參數。

    ????????????? ?????? <field ?????? property="userName"

    ????????????? ????????????? ?????? depends="required,maxlength">

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

    ????????????? ?????? ?????? <arg2 key="${var:maxlength}" name="maxlength" resouce="false"/>

    ????????????? ?????? ?????? <var>

    ????????????? ????????????? ?????? <var-name>maxlength</var-name>

    ????????????? ????????????? ?????? <var-value>80</var-value>

    ????????????? ?????? ?????? </var>

    ????????????? ?????? </field>

    ????????????? ?????? <field property="email"

    ??????????????????? depends="email">

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

    ??????????? </field>

    ?????? ?????? </form>

    ?????? ?????? <form name="custGNewCheckForm">

    ????????????? ?????? <field?????? property="certifiCode"

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

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

    ????????????? ?????? </field>

    ?????? ?????? </form>

    ??? </formset>

    </form-validation>

    在校驗頁面的 <body> 前添加如下內容: <html:errors/>

    3、 ??????????? DynaValidatorForm

    不需要再寫對應的 ActionForm ,只需在 struts-config.xml 里把自己的 ActionForm 進行配置:

    <form-bean name="testForm" type="org.apache.struts.validator. DynaValidatorForm">

    ?????? <form-property name="mytext" type="java.lang.String"/>

    <form-property name="mytextarea" type="java.lang.String"/>

    ?????? <form-property name="mydatetext" type="java.lang.String"/>

    </form-bean>

    form-property 里設置相應的項目,比如說 mytext mytextarea 什么的,執行的時候會動態生成 ActionForm ,再在 validation.xml 里寫入所希望的驗證代碼,就可以了。 JSP 文件里不需要寫入任何東西,驗證也是在服務器端進行,驗證部分代碼在 JSP 中不可見。

    4、 ??????????? 組合驗證

    如果使用動態驗證 DynaValidatorForm 的話,不許編寫自己的 對應的 ActionForm ,相應的特殊驗證會受到相當程度的限制。這個時候,需要將特殊驗證部分寫入對應的 Action

    if(mytext.equals("aaa")){//My Example

    ActionErrors errors = new ActionErrors();

    errors.add("***",new ActionError("***.error"));??????

    saveErrors(request,errors);

    return (mapping.findForward("false"));

    }

    就可以實現特殊驗證了。

    ?

    ?????? 實際上你的 FORM 還可以繼承 ValidatorActionForm DynaValidatorActionForm ,這兩種與他們對應的 ValidatorForm DynaValidatorForm 的唯一區別正如開篇就講到的:在 struts-config.xml 中查找對應的 FORM 類時,前者根據 ACTION PATH 值,而后者使用 NAME 值。

    范例:

    Struts 驗證器:驗證兩個字段匹配

    在使用指南中,有一節講述怎樣創建驗證器來驗證兩個字段匹配,我用這個服務器端驗證器(象例子中顯示的那樣)做口令,確定口令驗證。這個已經可以正常工作了;但我還想用客戶端的 javascript 驗證器來試一試。我寫了自己的程序來比較兩個字段,但他們和推薦給你的那個不同( from validator-rules.xml )。所以昨天,我補充了怎樣添加 JavaScript 方法到 validator-rules.xml 這里就是怎樣配置的的整個過程(大部分在使用指南中已經包含了,保存 JavaScript )。

    怎樣添加兩個字段的驗證器

    Step 1: 生成一個包含 validateTwoFields 方法的 類。在我的代碼重,我的類定義為 ValidationUtil ,他有下列方法:

    ?

    public static boolean validateTwoFields(

    Object bean,

    ValidatorAction va,???????????????????????????????????????

    Field field,

    ActionErrors errors,

    HttpServletRequest request) {

    ?

    ??? String value = ValidatorUtil.getValueAsString(bean, field.getProperty());

    ??? String sProperty2 = field.getVarValue("secondProperty");

    String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);

    ?

    ??? if (!GenericValidator.isBlankOrNull(value)) {

    ??????? try {

    ??????????? if (!value.equals(value2)) {

    ??????????????? errors.add(field.getKey(),

    ?????????????????????????? Resources.getActionError(request, va, field));

    ?

    ??????????????? return false;

    ??????????? }

    ??????? } catch (Exception e) {

    ??????????? errors.add(field.getKey(),

    ?????????????????????? Resources.getActionError(request, va, field));

    ?

    ??????????? return false;

    ??????? }

    ??? }

    ?

    ??? return true;

    }

    Step 2: 編輯 validator-rules.xml ,加入 "twofields" 規則。

    <validator name="twofields" classname="org.appfuse.webapp.util.ValidationUtil"

    method="validateTwoFields"

    ??? methodParams="java.lang.Object,

    ????????????????? org.apache.commons.validator.ValidatorAction,

    ????????????????? org.apache.commons.validator.Field,

    ????????????????? org.apache.struts.action.ActionErrors,

    ????????????????? javax.servlet.http.HttpServletRequest"

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

    ??? <javascript><![CDATA[

    ??????? function validateTwoFields(form) {

    ??????????? var bValid = true;

    ??????????? var focusField = null;

    ??????????? var i = 0;

    ??????????? var fields = new Array();

    ??????????? oTwoFields = new twofields();

    ??????????? for (x in oTwoFields) {

    ??????????????? var field = form[oTwoFields[x][0]];

    ??????????????? var secondField = form[oTwoFields[x][2]("secondProperty")];

    ???????????

    ??????????????? if (field.type == 'text' ||

    ??????????????????? field.type == 'textarea' ||

    ??????????????????? field.type == 'select-one' ||

    ??????????????????? field.type == 'radio' ||

    ??????????????????? field.type == 'password') {

    ???????????

    ??????????????????? var value;

    ??????????????????? var secondValue;

    ??????????????????? // get field's value

    ??????????????????? if (field.type == "select-one") {

    ??????????????????????? var si = field.selectedIndex;

    ? ?????????????????????? value = field.options[si].value;

    ??????????????????????? secondValue = secondField.options[si].value;

    ??????????????????? } else {

    ??????????????????????? value = field.value;

    ??????????????????????? secondValue = secondField.value;

    ??????????????????? }

    ???????????????

    ??????????????????? if (value != secondValue) {

    ???????????????????

    ??????????????????????? if (i == 0) {

    ??????????????????????????? focusField = field;

    ??????????????????????? }

    ??????????????????????? fields[i++] = oTwoFields[x][1];

    ??????????????????????? bValid = false;

    ??????????????????? }

    ??????????????? }

    ??????????? }

    ???????????

    ??????????? if (fields.length > 0) {

    ??????????????? focusField.focus();

    ??????????????? alert(fields.join('\n'));

    ??????????? }

    ???????????

    ??????????? return bValid;

    ??????? }]]></javascript>

    </validator>

    Step 3: validation.xml 為你的表單配置驗證:

    <field property="password" depends="required,twofields">

    ? <msg name="required" key="errors.required"/>

    ? <msg name="twofields" key="errors.twofields"/>

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

    ? <arg1 key="userForm.confirmPassword"/>

    ? <var>

    ??? <var-name>secondProperty</var-name>

    ??? <var-value>confirmPassword</var-value>

    ? </var>

    </field>

    這里 errors.twofields 字段 '{0}' 必須與字段 '{1}' 的值相同。第三步的一個可選的工作就時使用 XDoclet 來生成 validation.xml requires (1) 配置 XDoclet ( 當然 ) (2) 在你的表單中添加添加一些 @struts 標簽 setPassword 方法

    /**

    ?* Returns the password.

    ?* @return String

    ?*

    ?* @struts.validator type="required" msgkey="errors.required"

    ?* @struts.validator type="twofields" msgkey="errors.twofields"

    ?* @struts.validator-args arg1resource="userForm.password"

    ?* @struts.validator-args arg1resource="userForm.confirmPassword"

    ?* @struts.validator-var name="secondProperty" value="confirmPassword"

    ?*/

    public String setPassword() {

    ?????? return password;

    }

    我昨天已經把這個作為建議發送給struts-dev郵件列表, 但還沒有收到任何消息。


    posted on 2006-08-17 19:32 SIMONE 閱讀(603) 評論(0)  編輯  收藏 所屬分類: struts
    主站蜘蛛池模板: 亚洲嫩草影院在线观看| 亚洲欧洲一区二区三区| 亚色九九九全国免费视频| 嫩草在线视频www免费观看| 最近2019中文免费字幕在线观看| 亚洲视频在线免费| 成人免费视频一区二区| 一级成人毛片免费观看| 一级毛片**免费看试看20分钟| 国产97视频人人做人人爱免费| 中文字幕无码免费久久9一区9| 日韩电影免费在线观看网站| 丁香花在线视频观看免费| 久久亚洲免费视频| 国产91免费视频| 国内一级一级毛片a免费| 免费亚洲视频在线观看| 在线精品亚洲一区二区三区 | 色老头综合免费视频| 一个人免费播放在线视频看片| 久久久WWW免费人成精品| 免费黄色电影在线观看| 亚洲日本在线免费观看| 最近2019中文字幕免费看最新| 永久黄网站色视频免费| 亚洲精品无码久久久| 亚洲成av人在线视| 亚洲一级毛片视频| 国产亚洲精彩视频| 国产成人无码区免费内射一片色欲| 三年片在线观看免费观看大全动漫 | 亚洲成a人片77777群色| 精品无码专区亚洲| 9i9精品国产免费久久| 99久久精品国产免费| 免费毛片在线看片免费丝瓜视频| 国产aa免费视频| 亚洲av色影在线| 亚洲精品无码不卡在线播放| 一级白嫩美女毛片免费| 69国产精品视频免费|