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

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

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

    【永恒的瞬間】
    ?Give me hapy ?

    驗(yàn)證器:

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

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

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

    一個(gè)分離的action可以定義給多頁(yè)form的每個(gè)頁(yè)面,而且驗(yàn)證規(guī)則可以與action關(guān)聯(lián)而不是與頁(yè)碼,就像驗(yàn)證范例中的多頁(yè)form范例那樣。

    國(guó)際化

    validator-rules.xml 文件中form的驗(yàn)證規(guī)則可以組織為FormSet。FormSet 有與java.util.Locale 類相應(yīng)的屬性:如語(yǔ)言, 國(guó)家以及變量型屬性,如果他們未定義,F(xiàn)ormSet 將把它設(shè)置為默認(rèn)值。一個(gè)FormSet 也可以有關(guān)聯(lián)的常量。另外還可以定義與FormSet 同一級(jí)別的全局global元素,他與FormSet同樣也有常量。

    注意 :你必須在國(guó)際化的FormSet前聲明一個(gè)沒(méi)有國(guó)際化的默認(rèn)FormSet。這樣如果Validator沒(méi)有找到locale時(shí)可以有一個(gè)默認(rèn)版本。

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

    ?????? error messages的可以設(shè)置arg0-arg3 等參數(shù)元素。如果沒(méi)有設(shè)置arg0-arg3的name屬性, error messages將使用他們作為默認(rèn)的構(gòu)建參數(shù)值。如果設(shè)置了name屬性,你就可以把參數(shù)指定給一特定的可插入驗(yàn)證器,然后這些參數(shù)將在構(gòu)造錯(cuò)誤信息時(shí)被使用。

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

    默認(rèn)的arg0-arg3元素將在消息資源中查找相應(yīng)的key,如果資源屬性設(shè)為false,她將把值直接傳進(jìn)去,而不從消息資源中查找。注意1.1版本中,你必須為每個(gè)模塊中明確地定義在驗(yàn)證中用到的消息資源,否則將使用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>

    常量 / 變量

    全局的常量可以在全局標(biāo)簽中定義,FormSet/本地常量能在formset 標(biāo)簽中創(chuàng)建。常量當(dāng)前僅僅是代替字段的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>

    驗(yàn)證器可以使用字段下面的變量部分來(lái)存儲(chǔ)變量,這些變量通過(guò)字段的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 設(shè)計(jì)復(fù)雜的驗(yàn)證

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

    ?????? validwhen 規(guī)則處理單個(gè)的變量字段,叫測(cè)試。這變量的值是一個(gè)布爾的表達(dá)式,如果驗(yàn)證有效則它必須為真。可以包含這種變量的表達(dá)式有:

    u ?????? 單引號(hào)或雙引號(hào)字符串literals,

    u ?????? 十進(jìn)制、十六進(jìn)制、八進(jìn)制的Integer literals,

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

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

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

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

    The literal *這里指它包含當(dāng)前測(cè)試字段的值,

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

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

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

    這里有個(gè)稍微復(fù)雜的例子,它使用了索引字段。假定有一個(gè)表單,允許用戶輸入他們希望定購(gòu)的部件號(hào)和數(shù)量。類orderLine 的bean的一數(shù)組被用來(lái)在稱為orderLines 的一屬性保持輸入項(xiàng)。

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

    如果你希望校驗(yàn)訂單中有數(shù)量輸入得每一行,你可以這樣:

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

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

    最后一個(gè)例子,想象一表單,用戶必須輸入他們的以英寸為單位的高度,如果他們?cè)诟叨仍?span lang="EN-US">60英寸以下,則出一錯(cuò)誤。(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>

    ?

    給程序員的簡(jiǎn)單說(shuō)明:

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

    只有兩個(gè)itme時(shí)可以and或or鏈接。

    如果比較的兩item都可以轉(zhuǎn)為整數(shù),則使用numeric比較,否則使用字符串比較。

    可插入驗(yàn)證器

    驗(yàn)證是從validation.xml 文件中加載的,默認(rèn)的驗(yàn)證規(guī)則定義在validation.xml 文件中,默認(rèn)定義了required, mask ,byte, short, int, long, float, double, date (沒(méi)有本地支持), and a numeric range。

    " mask "方式依賴于默認(rèn)值安裝要求,那意味著"required "可以完成,在"'mask "將運(yùn)行以前"required "和" mask "方式被默認(rèn)包含進(jìn)框架中了。任何字段如果不是"required "而且是空或有零長(zhǎng)度將跳過(guò)其他驗(yàn)證。

    如果使用了Javascript 標(biāo)簽,客戶端javascript在validator's javascript 屬性中查找值而且產(chǎn)生一個(gè)有驗(yàn)證form方法的對(duì)象,要得到更多的關(guān)于Javascript Validator 標(biāo)簽工作細(xì)節(jié)的詳細(xì)的解釋,參閱html標(biāo)簽API參考。

    "'mask' "方式讓你用一正則表達(dá)式掩碼驗(yàn)證字段,它使用jakarta的正規(guī)表達(dá)式包,所有的有效性規(guī)則存儲(chǔ)在validator-rules.xml 文件,使用的主類是org.apache.regexp.RE。

    validation.xml文件中的驗(yàn)證器配置范例:

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

    ?

    定義可插入驗(yàn)證器

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

    java.lang.Object – 要驗(yàn)證的Bean。

    org.apache.commons.validator.ValidatorAction – 當(dāng)前ValidatorAction。

    org.apache.commons.validator.Field – 要驗(yàn)證的字段

    org.apache.struts.action.ActionErrors – 如果驗(yàn)證錯(cuò)誤將加入ActionError的錯(cuò)誤對(duì)象javax.servlet.http.HttpServletRequest –當(dāng)前request 對(duì)象。

    javax.servlet.ServletContext – 應(yīng)用的ServletContext。

    org.apache.commons.validator.Validator–當(dāng)前的org.apache.commons.validator.Validator實(shí)例。

    java.util.Locale – 當(dāng)前用戶的Locale。

    多頁(yè)面form

    字段部分有一可選的頁(yè)面屬性,它可以被設(shè)為整數(shù),頁(yè)上字段的所有驗(yàn)證小于或等于服務(wù)器端驗(yàn)證的當(dāng)前頁(yè),頁(yè)上字段的所有驗(yàn)證小于或等于客戶端頁(yè)上所有字段的驗(yàn)證小于或等于服務(wù)器端驗(yàn)證的當(dāng)前頁(yè)驗(yàn)證的當(dāng)前頁(yè)。一個(gè)mutli-part表單需要定義頁(yè)面屬性:

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

    比較兩個(gè)字段

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

    <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包,所以問(wèn)題報(bào)告和增強(qiáng)需求可能在兩個(gè)產(chǎn)品中列出。

    · ?? Struts Validator Bugzilla Reports

    · ?? Commons Validator Bugzilla Reports

    變更和 deprecations

    新建的標(biāo)記屬性。

    <html:javascript>標(biāo)記有新的屬性定義.

    使用commons-validator.jar中的DTD驗(yàn)證。

    當(dāng)前使用的驗(yàn)證XML文件是根據(jù)commons-validator.jar中的DTD。Struts不在為validator-rules.xml and validator.xml.單獨(dú)維護(hù)一個(gè)分離的DTD,另外,commons-validator 現(xiàn)在維護(hù)一個(gè)統(tǒng)一的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">

    空字段。

    當(dāng)前默認(rèn)在所有得基礎(chǔ)驗(yàn)證類型中忽略空白的字段,如果你要求一個(gè)字段必須輸入,那末在你的應(yīng)用的validator.xml 文件相應(yīng)的字段定義的depends屬性中添加 " required "。

    新建的范圍RANGE方法.

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

    有條件地REQUIRED字段.

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

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

    你的validation.xml 文件的輸入項(xiàng)應(yīng)該是這樣的:

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

    ?

    這里有一個(gè)使用索引的屬性更復(fù)雜的例子,如果你的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有l(wèi)astName,firstName,dob,coverageType四個(gè)屬性,你可以這樣定義一驗(yàn)證規(guī)則:

    <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。因?yàn)樽侄蜪ndexed 為真,這它意味著lastName的indexed 必須與firstName 的索引的一樣,dob同理,除非date不為空。

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

    你可以對(duì)字段在[n]中使用任意數(shù)字,唯一的限制是他們必須都是AND或OR,你無(wú)法混合使用。

    Deprecation:

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

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

    驗(yàn)證器 api 指南

    一個(gè)簡(jiǎn)明的Struts驗(yàn)證器API指南 可以幫助你開(kāi)始。

    驗(yàn)證器資源

    Struts Validator: Validating Two Fields Match 作者M(jìn)att Raible。(兩個(gè)字段匹配驗(yàn)證)關(guān)于使用方法的文章。(范例部分為翻譯此文內(nèi)容)

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

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


    使用方法

    作者:

    丑陋 && Snowtears :經(jīng)過(guò) 2 周的不懈努力,閱讀了大量的資料,終于對(duì) Validator 有了個(gè)初步的認(rèn)識(shí),整理了一下,淺淺的談了談寫(xiě)法,希望能有一定的幫助,其中肯定有許多說(shuō)的不對(duì)不準(zhǔn)確的地方,還請(qǐng)多指教 real_herozx@163.net

    ?????? 王藝:

    ?????? 根據(jù)以上兩位的文章正理而成

    配置 ruts-config.xml

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

    如:

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

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

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

    為了能夠在頁(yè)面上顯示錯(cuò)誤提示信息,我們還需要將以下內(nèi)容添加到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現(xiàn)在支持的錯(cuò)誤類型的錯(cuò)誤提示信息,如果你自定義了新類型的錯(cuò)誤驗(yàn)證,則還需要在此加上你自己的內(nèi)容。

    以上內(nèi)容中的{0}指的是錯(cuò)誤提交的參數(shù)。比如:當(dāng)你需要頁(yè)面上的“用戶名”不能為空時(shí)(也就是上面的errors.required),這個(gè){0}就代表“用戶名”,所以如果你沒(méi)有填寫(xiě)用戶名將拋出如下錯(cuò)誤:

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

    我們可能已經(jīng)注意到了,既然錯(cuò)誤提示信息需要配置,那么上例中“用戶名”系統(tǒng)是如何得到的呢?沒(méi)錯(cuò)!也是通過(guò)修改此配置文件,內(nèi)容如下:

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

    這樣當(dāng)“用戶名”為空時(shí),struts后臺(tái)程序?qū)⒙?lián)合以上兩處定義顯示錯(cuò)誤信息。

    另外,上面的“visitCust.error.name.required”是在Validation.xml配置驗(yàn)證內(nèi)容時(shí)指定的。具體見(jiàn)以下介紹

    注意:一般情況下,你的系統(tǒng)只需要一個(gè)ApplicationResources文件,所以開(kāi)發(fā)組的成員不要添加自己的resource文件。只有在你的項(xiàng)目分組開(kāi)發(fā)時(shí)才需要使用多個(gè)ApplicationResources文件,但是,同時(shí)你的struts-config.xml文件也會(huì)有相同的數(shù)量對(duì)應(yīng)。

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

    加入這個(gè)插件后你的應(yīng)用就具備使用Validator的環(huán)境,如:

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

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

    <action-mappings>里,定義需要驗(yàn)證的畫(huà)面對(duì)應(yīng)的Action的時(shí)候要加上validate="true"

    四種使用方法

    1、 ??????????? Javascript在客戶端進(jìn)行驗(yàn)證

    配置:在需要驗(yàn)證的JSP文件中寫(xiě)入

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

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

    <html:javascript formName="mytestForm"/>

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

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

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

    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;

    }

    此時(shí),如果寫(xiě)了這個(gè)方法,就會(huì)屏蔽掉在Validation.xml中定義的驗(yàn)證部分,換句話說(shuō)就是系統(tǒng)運(yùn)行時(shí),Validation.xml里對(duì)應(yīng)此ActionForm的定義的錯(cuò)誤驗(yàn)證部分不實(shí)行,如果不寫(xiě)這個(gè)方法的話,系統(tǒng)運(yùn)行時(shí)會(huì)進(jìn)行Validation.xml里對(duì)應(yīng)此ActionForm的定義的錯(cuò)誤驗(yàn)證部分的操作。此類方法是在服務(wù)器端進(jìn)行驗(yàn)證,驗(yàn)證部分代碼客戶端不可見(jiàn)。

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

    <form-validation>

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

    ??? <formset>

    ?????? ?????? <form name="custGNewForm">需要驗(yàn)證頁(yè)面上form的名字

    ????????????? ?????? <field property="certifiCode"需要校驗(yàn)的屬性

    ????????????? ????????????? ?????? depends="required,maxlength">校驗(yàn)內(nèi)容

    ????????????? ?????? ?????? <arg0 key="prompt.certifiCode"/>ApplicationResource文件中對(duì)應(yīng)

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

    ????????????? ?????? ?????? <var>確定最長(zhǎng)限制的長(zhǎng)度

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

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

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

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

    注意:此處的arg0和arg1就代表了ApplicationResources文件中使用“{}”括起來(lái)的參數(shù)。比如:

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

    定義了三個(gè)參數(shù),所以你這里也要定義<arg0>、<arg1>、<arg2>三個(gè)參數(shù)才能完整的顯示錯(cuò)誤信息。

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

    定義了0、2兩個(gè)參數(shù),所以你就需要定義<arg0>和<arg2>兩個(gè)參數(shù)。

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

    在校驗(yàn)頁(yè)面的<body>前添加如下內(nèi)容:<html:errors/>

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

    不需要再寫(xiě)對(duì)應(yīng)的ActionForm,只需在struts-config.xml里把自己的ActionForm進(jìn)行配置:

    <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里設(shè)置相應(yīng)的項(xiàng)目,比如說(shuō)mytext,mytextarea什么的,執(zhí)行的時(shí)候會(huì)動(dòng)態(tài)生成ActionForm,再在validation.xml里寫(xiě)入所希望的驗(yàn)證代碼,就可以了。JSP文件里不需要寫(xiě)入任何東西,驗(yàn)證也是在服務(wù)器端進(jìn)行,驗(yàn)證部分代碼在JSP中不可見(jiàn)。

    4、 ??????????? 組合驗(yàn)證

    如果使用動(dòng)態(tài)驗(yàn)證DynaValidatorForm的話,不許編寫(xiě)自己的對(duì)應(yīng)的ActionForm,相應(yīng)的特殊驗(yàn)證會(huì)受到相當(dāng)程度的限制。這個(gè)時(shí)候,需要將特殊驗(yàn)證部分寫(xiě)入對(duì)應(yīng)的Action,

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

    ActionErrors errors = new ActionErrors();

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

    saveErrors(request,errors);

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

    }

    就可以實(shí)現(xiàn)特殊驗(yàn)證了。

    ?

    ?????? 實(shí)際上你的FORM還可以繼承ValidatorActionForm和DynaValidatorActionForm,這兩種與他們對(duì)應(yīng)的ValidatorForm和DynaValidatorForm的唯一區(qū)別正如開(kāi)篇就講到的:在struts-config.xml中查找對(duì)應(yīng)的FORM類時(shí),前者根據(jù)ACTION的PATH值,而后者使用NAME值。

    范例:

    Struts 驗(yàn)證器:驗(yàn)證兩個(gè)字段匹配

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

    怎樣添加兩個(gè)字段的驗(yàn)證器

    Step 1: 生成一個(gè)包含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" 規(guī)則。

    <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 為你的表單配置驗(yàn)證:

    <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}' 的值相同。第三步的一個(gè)可選的工作就時(shí)使用XDoclet 來(lái)生成validation.xml requires (1) 配置XDoclet (當(dāng)然)和(2) 在你的表單中添加添加一些@struts 標(biāo)簽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;

    }

    我昨天已經(jīng)把這個(gè)作為建議發(fā)送給struts-dev郵件列表, 但還

    posted on 2007-02-02 20:21 ???MengChuChen 閱讀(377) 評(píng)論(0)  編輯  收藏 所屬分類: struts
    主站蜘蛛池模板: 中文字幕免费在线| 免费视频爱爱太爽了| 免费一级成人毛片| 在线精品自拍亚洲第一区| 永久免费观看的毛片的网站| 亚洲av永久无码天堂网| 国产精品成人无码免费| 美女视频黄a视频全免费网站色| 四虎影在线永久免费观看| 青青草国产免费国产是公开| 亚洲欧洲精品成人久久曰影片| 久久国产一片免费观看| 国产亚洲成av人片在线观看| 久久免费视频99| 亚洲AV无码国产精品色| 久久久久久国产精品免费免费| 亚洲精品宾馆在线精品酒店| 又粗又大又硬又爽的免费视频| 深夜福利在线视频免费| 国产亚洲精AA在线观看SEE| 日韩精品无码免费一区二区三区 | 在线观看日本亚洲一区| 永久免费AV无码网站在线观看| 免费视频成人国产精品网站| 亚洲熟妇无码AV在线播放| 最近免费字幕中文大全视频| 亚洲欧洲日本在线观看| 2022中文字字幕久亚洲| 99精品免费观看| 亚洲A∨精品一区二区三区下载| 亚洲国产综合人成综合网站| 无码精品国产一区二区三区免费| 亚洲av专区无码观看精品天堂 | 暖暖免费日本在线中文| 亚洲一区二区三区播放在线 | 2021国内精品久久久久精免费| 中文字幕亚洲情99在线| 国产成人精品久久亚洲| 国产成人yy免费视频| 一级成人a免费视频| 亚洲av乱码一区二区三区|