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

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

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

    posts - 15,  comments - 8,  trackbacks - 0

    validwhen主要用于關聯驗證,即為了驗證某個域的值,可能會參考其它域的值來進行綜合判斷,以確定該域的值是否符合要求。

    1,表達式及其注意事項

    輸入給validwhen的是一個布爾型表達式(對該表達式的解析使用了antlr),其引用名為test,即形如:

    <var>
      <var-name>test</var-name>
      <var-value>expression</var-name>
    </var>

    即,當expression為真(true)時,該域驗證通過,其中,expression可以使用的元素包括:

    1)表單中其它域屬性的名稱,例如:
    <var>
      <var-name>test</var-name>
      <var-value>(color=="red")</var-name>
    </var>
    例子中color為表單中其它某個域的屬性名。

    2)*this*,用于表示該域的屬性名稱,即對正在驗證的屬性自身,其變量的引用為*this*,例如:
    <var>
      <var-name>test</var-name>
      <var-value>((color=="red") and (*this* != null))</var-name>
    </var>

    3)可以使用一些常規運算符,如 >、<、==、>=、<=、!=、+、-、*、/、%等等。例如:
    <var>
      <var-name>test</var-name>
      <var-value>((color=="red") and (age>=25))</var-name>
    </var>

    4)可以使用邏輯運算 and 、or,例如:
    <var>
      <var-name>test</var-name>
      <var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>
    </var>
    在使用and和or時要注意一點,在同一級的邏輯運算中,同時只能存在一個邏輯運算符,要么是and,要么是or,即:
    xxx and yyy
    或者
    xxx or yyy
    如果在同一級出現多于一個的and或or或and和or的組合,那么是不合法的,例如下面的表達式是不合法的:
    xxx and yyy and zzz
    或者
    xxx or yyy or zzz
    或者
    xxx and yyy or zzz
    等等
    為了讓復雜的表達變得合法,可以讓一個復雜的表達式變為多級的表達形式,每一級只有一個and或一個or就可以了,例如:
    xxx and yyy and zzz是錯誤的,進行一下簡單的變換:
    (xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

    5)其他合法的輸入,例如可以使用雙引號和單引號引用literal字符串等等。

    2,錯誤消息的定制

    無論是validwhen還是其它驗證例程,都可以定制驗證出錯后的錯誤信息,定制消息有兩種方式,即全局方式和本地方式。

    1)全局方式,即在validator-rules.xml中某個validator里面定義的消息,參數名為msg,例如:

    <validator name="email"
                classname="org.apache.struts.validator.FieldChecks"
                   method="validateEmail"
             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.email"/>

    其中,msg的值為resource bundle中的一個屬性名

    。例如在resource bundle文件中存在如下定義:
    errors.email={0} is an invalid e-mail address.

     

    2)本地方式,即在validation.xml中的field中定義的錯誤消息,格式為:
    <msg key="value" resource="booleanValue"/>
    例如:
                 <field property="endDate"
                        depends="validwhen,date">
                    <msg name="validwhen" key="date.validwhen"/>
                    <arg0 key="start time" resource="false"/>
                    <arg1 key="end time" resource="false"/>
                    <var>
                         <var-name>test</var-name> 
                         <var-value>((*this* != nulland (*this*>startDate))</var-value>
                    </var>
                 </field>

    這里需要注意的是
    * <msg>的name屬性的值應該為某個驗證例程的名稱,例如name="validwhen"、name="date"等,這指明了當該field的該驗證例程(本例是validwhendate)出錯時所顯示的錯誤信息。
    *如果全局已經定義了msg的信息,而且本地的msg的key與全局的msg的key相同,那么在該field的驗證中,本地的msg將覆蓋全局的msg。
    *<arg0>到<arg4>的屬性中也有name屬性,即該arg參數所應用的驗證例程,例如<arg0 key="label.startDate"/>,即該參數用于date驗證的出錯信息。注意,對于一個field,需要的驗證規則有時不止一個,例如depends="required,date",而多個驗證規則中的每一個都需要出錯時傳入一些參數信息,如果它們所需要的參數個數、名稱和順序都相同,那么只要定義<arg0...、<arg1...等等即可。但是如果它們需要的參數的個數、名稱和順序不同怎么辦,如果我們對于第一個輸入參數只定義一個arg0,那么這個arg0用于哪個驗證消息,因此這時必須通過arg標簽的name屬性來表示該參數所服務的驗證。

    3,例子

    場景:在一個表單中,有兩個文本域,用于得到一個時間段,一個文本域輸入起始日期(startDate),另一個輸入終止日期(endDate)。
    約束:日期格式為:年(四位數)-月(兩位數)-日(兩位數),而且終止日期大于起始日期。

    根據上述條件,驗證規則如下:
    <field property="startDate"
        depends="date">
        <arg0 key="form.date.start"/>
        <var>
            <var-name>datePatternStrict</var-name>
            <var-value>yyyy-MM-dd</var-value>
        </var>
    </field>
    <field property="endDate"
        depends="validwhen,date">
        <msg name="validwhen" key="date.validwhen"/>
        <arg0 name="validwhen" key="form.date.start"/>
        <arg1 name="validwhen" key="form.date.end"/>
        <arg0 name="date" key="form.date.end"/>
        <var>
            <var-name>test</var-name>
            <var-value>((*this* != nulland (*this*>startDate))</var-value>
        </var>
        <var>
            <var-name>datePatternStrict</var-name>
            <var-value>yyyy-MM-dd</var-value>
        </var>
    </field> 

    在資源文件中加入如下message:

     

    form.date.start=起始日期
    form.date.end=終止日期
    date.validwhen= {0}不能大于{1}!
    posted on 2008-09-04 15:25 lvq810 閱讀(438) 評論(0)  編輯  收藏 所屬分類: Open Framekwork
    主站蜘蛛池模板: 久久亚洲国产中v天仙www| 免费国产a国产片高清| 亚洲va久久久噜噜噜久久天堂| 一级毛片免费一级直接观看| 亚洲国产精品综合久久网络| 日韩免费高清一级毛片| 亚洲最大av无码网址| 91精品全国免费观看青青| 亚洲性线免费观看视频成熟| 18禁免费无码无遮挡不卡网站| 亚洲香蕉久久一区二区| 在线免费观看毛片网站| 亚洲综合国产精品第一页| 日韩在线视频播放免费视频完整版| 亚洲AV无码之日韩精品| 中文在线免费不卡视频| 女人18毛片水真多免费播放| 亚洲a∨无码精品色午夜| 免费午夜爽爽爽WWW视频十八禁 | 一级毛片a免费播放王色电影 | 成人免费的性色视频| 亚洲成a人无码亚洲成www牛牛| 国产一区视频在线免费观看| 中文字幕久无码免费久久| 亚洲高清在线播放| a级片免费在线播放| 亚洲理论精品午夜电影| 国产一级淫片视频免费看| 青柠影视在线观看免费| 亚洲国产精品午夜电影| 国产亚洲福利一区二区免费看| 国产高潮久久免费观看| 亚洲日产2021三区| 免费成人av电影| 91制片厂制作传媒免费版樱花| 国产aⅴ无码专区亚洲av麻豆 | 亚洲一区二区三区无码中文字幕| 永久在线免费观看| 男男gay做爽爽的视频免费| 亚洲成人动漫在线| 亚洲国产精品无码久久久久久曰 |