struts validate校驗框架

利用繼承了ActionForm的普通formBean的validate方法來驗證表單數據,當在validate方法返回非空的 ActionErrors對象時,ActionServlet會根據配置文件中的input屬性來進行請求轉發,並不會執行action的execute 方法。
----------------------------------------------------------------------------------------------------
使用validate校驗框架則需要formBean繼承ValidatorForm,且不可重寫validate方法。或者使用動態FormBean,配置在文件中
<form-bean name="newPasswordForm"
            type="org.apache.struts.validator.DynaValidatorForm">
            <form-property name="oldPassword" type="java.lang.String" />
            <form-property name="newPassword1" type="java.lang.String" />
            <form-property name="newPassword2" type="java.lang.String" />
 </form-bean>

使用validate框架需要在struts-config.xml中添加<plug-in>節點
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
            value="/validator-rules.xml,/myapp.validator.xml,/demo.validator.xml,/systool.validator.xml" />
</plug-in>
其中 validator-rules.xml是定義校驗規則的配置文件,不需要修改。
其他的則需要手動編寫。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
<form-validation>
    <global>
        <constant>
            <constant-name>datePattern</constant-name>
            <constant-value>yyyy-MM-dd</constant-value>
        </constant>
        <constant>
            <constant-name>userName</constant-name>
            <constant-value>^[a-zA-Z]{1}[a-zA-Z0-9_]*$</constant-value>
        </constant>
    </global>
    <formset>
<form name="commonLogQueryForm">
------------------------------------------------
 <!--name指定所需校驗的formBean-->
---------------------------------------------------
            <field property="content" depends="maxlength">
                <arg position="0" key="commonLog.content" resource="true" />
                <arg position="1" key="${var:maxlength}" resource="false" />
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>200</var-value>
                </var>
            </field>

            <field property="operatStartTime" depends="date">
                <arg position="0" key="commonLog.operatStartTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
            </field>

            <field property="operatEndTime" depends="date,validwhen">
                <arg position="0" key="commonLog.operatEndTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
                <msg name="validwhen" key="error.operatEndTime" />
                <var>
                    <var-name>test</var-name>
                    <var-value>(((operatStartTime==null) and
                        (operatEndTime==null)) or (((operatStartTime!=null) and
                        (operatEndTime!=null))and(*this* >= operatStartTime)) )</var-value>
                </var>
            </field>
        </form>
    </formset>
</form-validation>
---------------------------------------------------------
<!--
<field>節點對應formBean中需校驗的屬性,property指定屬性,depends指定校驗規則。
如maxlength指最大長度,在validator-rules.xml中的定義如下:

<validator name="maxlength"
            classname="org.apache.struts.validator.FieldChecks"
            method="validateMaxLength"
            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.maxlength"
            jsFunction="org.apache.commons.validator.javascript.validateMaxLength" />

如果違反該規則,就會加載errors.maxlength 在資源文件application.properties中所代表的錯誤信息
             errors.maxlength={0} 不能超過{1} 個字符.
若想要自定義錯誤的信息格式,可以使用<msg>節點。
<msg name="validwhen" key="error.operatEndTime" /> ,msg節點用來指定
   當違反name所指定的規則時,按照key所制定的資源文件來加載錯誤信息。
若不指定<msg>節點,則按照validator-rules.xml中的msg所指定的key來加載錯誤信息。

在上述的錯誤信息中可以使用佔位符{0},{1},{2},{3},{4}來加載信息,並在配置文件中使用<arg>節點來爲佔位符指定加載的信息。

<arg position="0" key="commonLog.content" resource="true" />
<arg position="1" key="${var:maxlength}" resource="false" />
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>200</var-value>
                </var>

其 中position指定佔位符。name用來指定所屬的校驗規則,適用於當有多個校驗規則時。key用來指定在資源文件中的錯誤信息。resource指 定錯誤信息是否來源於資源文件,爲true時,會到資源文件中根據key來加載錯誤信息,爲false時,會在文件本身尋找相配的信 息,key="${var:maxlength}",即加載變量maxlength所代表的信息,即200.

當校驗規則需要外界提供一些參數的時候,就會用到<arg>節點。如maxlength規則會要求外界指定最大值。
date規則會要求指定日期格式,validwhen 規則會要求指定條件等
例如:date規則
<field property="operatStartTime" depends="date">
                <arg position="0" key="commonLog.operatStartTime" resource="true" />
                <var>
                    <var-name>date</var-name>
                    <var-value>${datePattern}</var-value>
                </var>
</field>
其變量名稱爲date,值爲global節點中定義的datePattern,即yyyy-MM-dd。
也可指定變量名爲 datePatternStrict 值同樣爲${datePattern}
對於validwhen較爲複雜,下面是一篇轉載:
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
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 * != null ) and ( * 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 * != null ) and ( * 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}!
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


-->
---------------------------------------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章