posts - 15,  comments - 8,  trackbacks - 0

          validwhen主要用于關(guān)聯(lián)驗(yàn)證,即為了驗(yàn)證某個(gè)域的值,可能會參考其它域的值來進(jìn)行綜合判斷,以確定該域的值是否符合要求。

          1,表達(dá)式及其注意事項(xiàng)

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

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

          即,當(dāng)expression為真(true)時(shí),該域驗(yàn)證通過,其中,expression可以使用的元素包括:

          1)表單中其它域?qū)傩缘拿Q,例如:
          <var>
            <var-name>test</var-name>
            <var-value>(color=="red")</var-name>
          </var>
          例子中color為表單中其它某個(gè)域的屬性名。

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

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

          4)可以使用邏輯運(yùn)算 and 、or,例如:
          <var>
            <var-name>test</var-name>
            <var-value>(((color=="red") and (age>=25)) or (color!="red"))</var-name>
          </var>
          在使用and和or時(shí)要注意一點(diǎn),在同一級的邏輯運(yùn)算中,同時(shí)只能存在一個(gè)邏輯運(yùn)算符,要么是and,要么是or,即:
          xxx and yyy
          或者
          xxx or yyy
          如果在同一級出現(xiàn)多于一個(gè)的and或or或and和or的組合,那么是不合法的,例如下面的表達(dá)式是不合法的:
          xxx and yyy and zzz
          或者
          xxx or yyy or zzz
          或者
          xxx and yyy or zzz
          等等
          為了讓復(fù)雜的表達(dá)變得合法,可以讓一個(gè)復(fù)雜的表達(dá)式變?yōu)槎嗉壍谋磉_(dá)形式,每一級只有一個(gè)and或一個(gè)or就可以了,例如:
          xxx and yyy and zzz是錯(cuò)誤的,進(jìn)行一下簡單的變換:
          (xxx and yyy) and zzz或者xxx and (yyy and zzz)等都是合法的。

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

          2,錯(cuò)誤消息的定制

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

          1)全局方式,即在validator-rules.xml中某個(gè)validator里面定義的消息,參數(shù)名為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中的一個(gè)屬性名

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

           

          2)本地方式,即在validation.xml中的field中定義的錯(cuò)誤消息,格式為:
          <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屬性的值應(yīng)該為某個(gè)驗(yàn)證例程的名稱,例如name="validwhen"、name="date"等,這指明了當(dāng)該field的該驗(yàn)證例程(本例是validwhen、date)出錯(cuò)時(shí)所顯示的錯(cuò)誤信息。
          *如果全局已經(jīng)定義了msg的信息,而且本地的msg的key與全局的msg的key相同,那么在該field的驗(yàn)證中,本地的msg將覆蓋全局的msg。
          *<arg0>到<arg4>的屬性中也有name屬性,即該arg參數(shù)所應(yīng)用的驗(yàn)證例程,例如<arg0 key="label.startDate"/>,即該參數(shù)用于date驗(yàn)證的出錯(cuò)信息。注意,對于一個(gè)field,需要的驗(yàn)證規(guī)則有時(shí)不止一個(gè),例如depends="required,date",而多個(gè)驗(yàn)證規(guī)則中的每一個(gè)都需要出錯(cuò)時(shí)傳入一些參數(shù)信息,如果它們所需要的參數(shù)個(gè)數(shù)、名稱和順序都相同,那么只要定義<arg0...、<arg1...等等即可。但是如果它們需要的參數(shù)的個(gè)數(shù)、名稱和順序不同怎么辦,如果我們對于第一個(gè)輸入?yún)?shù)只定義一個(gè)arg0,那么這個(gè)arg0用于哪個(gè)驗(yàn)證消息,因此這時(shí)必須通過arg標(biāo)簽的name屬性來表示該參數(shù)所服務(wù)的驗(yàn)證。

          3,例子

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

          根據(jù)上述條件,驗(yàn)證規(guī)則如下:
          <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 閱讀(440) 評論(0)  編輯  收藏 所屬分類: Open Framekwork
          主站蜘蛛池模板: 简阳市| 成安县| 迁西县| 洪湖市| 安图县| 莱芜市| 时尚| 西乌珠穆沁旗| 昌平区| 平乡县| 正宁县| 抚顺市| 双城市| 榆树市| 利津县| 阳西县| 华安县| 石台县| 佳木斯市| 株洲县| 明光市| 邹城市| 商丘市| 郓城县| 乐亭县| 玛纳斯县| 溆浦县| 河东区| 新乡市| 新营市| 西林县| 红桥区| 临颍县| 日喀则市| 弋阳县| 竹溪县| 宁明县| 榕江县| 洛扎县| 延边| 南宫市|