webwork提供了强大的验证功能,下边一一介绍一些常用的功能的用法。 一,首先webwork的validator是基于拦截器的,所以首先要配制一下拦截器,默认的拦截器,已经 使用了validator,如果你想定义自己的拦截器组合,记得在你的拦截器的stack中把这句话加入
 <interceptor-ref name="validation">  <param name="excludemethods">  input,back,cancel,browse  </param>  </interceptor-ref> 二、是否使用自定义validator:在一般情况下webwork提供的validator已经能应付大多数问题, 但是如果你想自己定义,那么记得注册你的验证器(validator),一个简单的注册办法是 添加一个文件名为 validators.xml 的文件在你的classpath (/web-inf/classes) 的根目录下 文件中的内容类似如下:
 <validators>  <validator name="required" class="com.opensymphony.xwork.validator.validators.requiredfieldvalidator"/>  <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.requiredstringvalidator"/>  <validator name="int" class="com.opensymphony.xwork.validator.validators.intrangefieldvalidator"/>  <validator name="double" class="com.opensymphony.xwork.validator.validators.doublerangefieldvalidator"/>  <validator name="date" class="com.opensymphony.xwork.validator.validators.daterangefieldvalidator"/>  <validator name="expression" class="com.opensymphony.xwork.validator.validators.expressionvalidator"/>  <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.fieldexpressionvalidator"/>  <validator name="email" class="com.opensymphony.xwork.validator.validators.emailvalidator"/>  <validator name="url" class="com.opensymphony.xwork.validator.validators.urlvalidator"/>  <validator name="visitor" class="com.opensymphony.xwork.validator.validators.visitorfieldvalidator"/>  <validator name="conversion" class="com.opensymphony.xwork.validator.validators.conversionerrorfieldvalidator"/>  <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.stringlengthfieldvalidator"/>  <validator name="regex" class="com.opensymphony.xwork.validator.validators.regexfieldvalidator"/>  </validators> 注意: 1,validators.xml如果已经定义了,那么它应该在classpath中可以找到.然而如果不需要自定义的校验器,那么这不是必须的.webwork会自动从发布包里的 xwork jar文件中取得一个事先定义好的校验器集合(com/opensymphony/xwork/validator/validators/default.xml). 浏览validatorfactory的static块来了解详细信息 2,如果自定义的校验器被定义了而且创建了一个validators.xml文件并放在classpath中, 记得复制所有其他你需要的预定义的校验器到validators.xml里,如果你不需要注册则不需要. 一旦validators.xml在classpath里被检测到,缺省的 (com/opensymphony/xwork/validator/validators/default.xml) 就不会被装载了.只有没发现自定义 validators.xml的时候才会装载.要小心.这点类似java中的缺省构造函数
 三、定义校验规则  <!doctype validators public "-//opensymphony group//xwork validator 1.0.2//en"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  <validators>  <field name="name">  <!--必添-->  <field-validator type="requiredstring">  <!--是否使用trim-->  <param name="trim">true</param>  <!--提示的错误信息-->  <message>you must enter a name</message>  </field-validator>  </field>  <field name="currdate">  <field-validator type="date">  <!--最小时间-->  <param name="min">01/01/2007</param>  <!--最大时间-->  <param name="max">02/28/2007</param>  <!--提示的错误信息-->  <message>  the date must be between 01-01-2007 and 02-28-2007.  </message>  </field-validator>  </field>  <field name="url">  <!--short-circuit是否短路检验,类似&&运算的短路算法-->  <field-validator type="required" short-circuit="true">  <!--提示的错误信息-->  <message>you must enter a value for url.</message>  </field-validator>  <!--webwork提供的url验证-->  <field-validator type="url" short-circuit="true">  <!--提示的错误信息-->  <message>not a valid url.</message>  </field-validator>  </field>  <field name="mail">  <field-validator type="required">  <message>you must enter a value for 邮件.</message>  </field-validator>  <!--mail的验证,验证器由webwork提供-->  <field-validator type="email">  <message>not a valid 邮件.</message>  </field-validator>  </field>  <field name="age">  <field-validator type="int">  <!--同样的最大最小值-->  <param name="min">1</param>  <param name="max">200</param>  <message>   <!--注意这里,msn中可以用表达式取出值栈中的值例如$  {min}-->   only people ages $  {min} to $  {max} may be true,otherwise  you are a ghost  </message>  </field-validator>  </field>  <field name="desc">  <field-validator type="requiredstring">  <param name="trim">true</param>  <message>you must enter a desc</message>  </field-validator>  <field-validator type="stringlength">  <param name="minlength">1</param>  <param name="maxlength">10</param>  <!--从属性文件中取出my.key显示,如果取不到my.key就显示  you must enter a desc length=10(my.key)-->  <message key="my.key">  you must enter a desc length=10(my.key)  </message>  </field-validator>  <!--可以使用正则表达式-->  <field-validator type="regex">  <param name="expression">  <![cdata[([a-z][0-9][a-z][x])]]>  </param>   <!--message可以由固定的字符串,值栈中的值$  {desc}以及通过调用方法取到的   属性文件中的值$  {gettext('my.key')}-->  <message>  "regex error ${gettext('my.key')} ${desc}"  </message>  </field-validator>  </field>  <!--上边的验证叫字段验证,下边这些验证叫普通验证,普通验证是优于字段验证的。  在使用短路的时候要小心-->  <!--上边那些都是基于字段的验证,这个是基于action的验证  如果要在页面显示这些消息,需要加入<ww:actionerror/>  -->  <validator type="expression">  <!--可以基于表达式的验证name.equals(desc)-->  <param name="expression">name.equals(desc)</param>  <message>name not the same as desc</message>  </validator>  <!-- plain validator 2 -->  <!--可以基于表达式的验证mail.startswith('mark')-->  <validator type="expression" short-circuit="true">  <param name="expression">mail.startswith('mark')</param>  <message>email does not start with mark</message>  </validator>  </validators>
四、客户端验证 加入validate="true" <ww:form name="test" action="javascriptvalidation" validate="true"> ... </ww:form> 这样的话webwork会根据你的服务器端的验证,对应生成javascript的验证,而且提示信息和服务器端 验证的方式一样,而不是alert的方式显示。(前题是你使用的都是标准的验证器) 五、 对应上边验证器的web页面
 <%@page contenttype="text/html; charset=utf-8" pageencoding="utf-8"%>  <%@ taglib prefix="ww" uri="/webwork"%>  <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">  <html>  <head>  <title></title>  <ww:head />  </head>  <body>  <!--  如果想统一的显示所有的erro打开下边这句  <ww:fielderror />  如果想显示其中一个error打开下边这句,默认显示在字段的正上方  <ww:fielderror>  <ww:param value="%{'name'}" />  </ww:fielderror>  <ww:fielderror>  <ww:param>desc</ww:param>  </ww:fielderror>  -->  <ww:form name="test" namespace="/" action="dbadmin" method="post" validate="true">  <ww:actionmessage />  <ww:actionerror/>  <ww:textfield label="name" name="name" />  <ww:date id="strcurrdate" name="currdate" format="yyyy-mm-dd" />  <ww:datepicker name="currdate" id="currdate" showstime="true"  format="%y-%m-%e %h:%m" cssclass="tx" language="zh" required="true"  template="datepicker.ftl" label="currdate" value="%{strcurrdate}" >  </ww:datepicker>  <ww:textfield label="url" name="url" />  <ww:textfield label="mail" name="mail" />  <ww:textfield label="age" name="age" />  <ww:textfield label="desc" name="desc" />  <ww:submit action="dbadmin" method="dotestvalidator"  value="dotestvalidator" />  </ww:form>  </body>  </html>  六、对应上边的action代码  package niis.web.actions.temp;   import java.text.simpledateformat;  import java.util.date;   import niis.persistence.itestdao;  import niis.persistence.dao.sqlcommand;  import niis.web.actions.abstractaction;    public class dbadminaction  {  private string name;  private date currdate ;  private string url;  private string mail;  private int age;  private string desc;   public string dotestvalidator()  {  system.out.println(name);  system.out.println(currdate);  system.out.println(url);  system.out.println(mail);  system.out.println(age);  return success;  }   /** *//**  * @return the age  */   public int getage()  {  return age;  }   /** *//**  * @param age the age to set  */   public void setage(int age)  {  this.age = age;  }   /** *//**  * @return the date  */   public date getcurrdate()  {  return currdate;  }   /** *//**  * @param date the date to set  */   public void setcurrdate(date date)  {  this.currdate = date;  }   /** *//**  * @return the mail  */   public string getmail()  {  return mail;  }   /** *//**  * @param mail the mail to set  */   public void setmail(string mail)  {  this.mail = mail;  }   /** *//**  * @return the name  */   public string getname()  {  return name;  }   /** *//**  * @param name the name to set  */   public void setname(string name)  {  this.name = name;  }   /** *//**  * @return the url  */   public string geturl()  {  return url;  }   /** *//**  * @param url the url to set  */   public void seturl(string url)  {  this.url = url;  }   /** *//**  * @return the testdao  */   public itestdao gettestdao()  {  return testdao;  }   /** *//**  * @return the desc  */   public string getdesc()  {  return desc;  }   /** *//**  * @param desc the desc to set  */   public void setdesc(string desc)  {  this.desc = desc;  }  } 七、简单提示:属性文件的名字类名+properties,validator配制文件的名字类名+validation.xml (还有其它的组合方式) 例如对应的dbadminaction.java dbadminaction-validation.xml dbadminaction.properties 注意 许多webwork 标签的 required 属性和客户端校验没有什么关系. 它只是在某个theme(例如xhtml)中用来在一个标识为必填的字段周围放置一个'*'.
八、上边程序的示例代码(从eclipse导出的工程) http://www.blogjava.net/files/dreamstone/vl.rar
 三、定义校验规则  <!doctype validators public "-//opensymphony group//xwork validator 1.0.2//en"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  <validators>  <field name="name">  <!--必添-->  <field-validator type="requiredstring">  <!--是否使用trim-->  <param name="trim">true</param>  <!--提示的错误信息-->  <message>you must enter a name</message>  </field-validator>  </field>  <field name="currdate">  <field-validator type="date">  <!--最小时间-->  <param name="min">01/01/2007</param>  <!--最大时间-->  <param name="max">02/28/2007</param>  <!--提示的错误信息-->  <message>  the date must be between 01-01-2007 and 02-28-2007.  </message>  </field-validator>  </field>  <field name="url">  <!--short-circuit是否短路检验,类似&&运算的短路算法-->  <field-validator type="required" short-circuit="true">  <!--提示的错误信息-->  <message>you must enter a value for url.</message>  </field-validator>  <!--webwork提供的url验证-->  <field-validator type="url" short-circuit="true">  <!--提示的错误信息-->  <message>not a valid url.</message>  </field-validator>  </field>  <field name="mail">  <field-validator type="required">  <message>you must enter a value for 邮件.</message>  </field-validator>  <!--mail的验证,验证器由webwork提供-->  <field-validator type="email">  <message>not a valid 邮件.</message>  </field-validator>  </field>  <field name="age">  <field-validator type="int">  <!--同样的最大最小值-->  <param name="min">1</param>  <param name="max">200</param>  <message>   <!--注意这里,msn中可以用表达式取出值栈中的值例如$  {min}-->   only people ages $  {min} to $  {max} may be true,otherwise  you are a ghost  </message>  </field-validator>  </field>  <field name="desc">  <field-validator type="requiredstring">  <param name="trim">true</param>  <message>you must enter a desc</message>  </field-validator>  <field-validator type="stringlength">  <param name="minlength">1</param>  <param name="maxlength">10</param>  <!--从属性文件中取出my.key显示,如果取不到my.key就显示  you must enter a desc length=10(my.key)-->  <message key="my.key">  you must enter a desc length=10(my.key)  </message>  </field-validator>  <!--可以使用正则表达式-->  <field-validator type="regex">  <param name="expression">  <![cdata[([a-z][0-9][a-z][x])]]>  </param>   <!--message可以由固定的字符串,值栈中的值$  {desc}以及通过调用方法取到的   属性文件中的值$  {gettext('my.key')}-->  <message>  "regex error ${gettext('my.key')} ${desc}"  </message>  </field-validator>  </field>  <!--上边的验证叫字段验证,下边这些验证叫普通验证,普通验证是优于字段验证的。  在使用短路的时候要小心-->  <!--上边那些都是基于字段的验证,这个是基于action的验证  如果要在页面显示这些消息,需要加入<ww:actionerror/>  -->  <validator type="expression">  <!--可以基于表达式的验证name.equals(desc)-->  <param name="expression">name.equals(desc)</param>  <message>name not the same as desc</message>  </validator>  <!-- plain validator 2 -->  <!--可以基于表达式的验证mail.startswith('mark')-->  <validator type="expression" short-circuit="true">  <param name="expression">mail.startswith('mark')</param>  <message>email does not start with mark</message>  </validator>  </validators>
 三、定义校验规则  <!doctype validators public "-//opensymphony group//xwork validator 1.0.2//en"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  <validators>  <field name="name">  <!--必添-->  <field-validator type="requiredstring">  <!--是否使用trim-->  <param name="trim">true</param>  <!--提示的错误信息-->  <message>you must enter a name</message>  </field-validator>  </field>  <field name="currdate">  <field-validator type="date">  <!--最小时间-->  <param name="min">01/01/2007</param>  <!--最大时间-->  <param name="max">02/28/2007</param>  <!--提示的错误信息-->  <message>  the date must be between 01-01-2007 and 02-28-2007.  </message>  </field-validator>  </field>  <field name="url">  <!--short-circuit是否短路检验,类似&&运算的短路算法-->  <field-validator type="required" short-circuit="true">  <!--提示的错误信息-->  <message>you must enter a value for url.</message>  </field-validator>  <!--webwork提供的url验证-->  <field-validator type="url" short-circuit="true">  <!--提示的错误信息-->  <message>not a valid url.</message>  </field-validator>  </field>  <field name="mail">  <field-validator type="required">  <message>you must enter a value for 邮件.</message>  </field-validator>  <!--mail的验证,验证器由webwork提供-->  <field-validator type="email">  <message>not a valid 邮件.</message>  </field-validator>  </field>  <field name="age">  <field-validator type="int">  <!--同样的最大最小值-->  <param name="min">1</param>  <param name="max">200</param>  <message>   <!--注意这里,msn中可以用表达式取出值栈中的值例如$  {min}-->   only people ages $  {min} to $  {max} may be true,otherwise  you are a ghost  </message>  </field-validator>  </field>  <field name="desc">  <field-validator type="requiredstring">  <param name="trim">true</param>  <message>you must enter a desc</message>  </field-validator>  <field-validator type="stringlength">  <param name="minlength">1</param>  <param name="maxlength">10</param>  <!--从属性文件中取出my.key显示,如果取不到my.key就显示  you must enter a desc length=10(my.key)-->  <message key="my.key">  you must enter a desc length=10(my.key)  </message>  </field-validator>  <!--可以使用正则表达式-->  <field-validator type="regex">  <param name="expression">  <![cdata[([a-z][0-9][a-z][x])]]>  </param>   <!--message可以由固定的字符串,值栈中的值$  {desc}以及通过调用方法取到的   属性文件中的值$  {gettext('my.key')}-->  <message>  "regex error ${gettext('my.key')} ${desc}"  </message>  </field-validator>  </field>  <!--上边的验证叫字段验证,下边这些验证叫普通验证,普通验证是优于字段验证的。  在使用短路的时候要小心-->  <!--上边那些都是基于字段的验证,这个是基于action的验证  如果要在页面显示这些消息,需要加入<ww:actionerror/>  -->  <validator type="expression">  <!--可以基于表达式的验证name.equals(desc)-->  <param name="expression">name.equals(desc)</param>  <message>name not the same as desc</message>  </validator>  <!-- plain validator 2 -->  <!--可以基于表达式的验证mail.startswith('mark')-->  <validator type="expression" short-circuit="true">  <param name="expression">mail.startswith('mark')</param>  <message>email does not start with mark</message>  </validator>  </validators>
四、客户端验证 加入validate="true" <ww:form name="test" action="javascriptvalidation" validate="true"> ... </ww:form> 这样的话webwork会根据你的服务器端的验证,对应生成javascript的验证,而且提示信息和服务器端 验证的方式一样,而不是alert的方式显示。(前题是你使用的都是标准的验证器) 五、 对应上边验证器的web页面
 <%@page contenttype="text/html; charset=utf-8" pageencoding="utf-8"%>  <%@ taglib prefix="ww" uri="/webwork"%>  <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">  <html>  <head>  <title></title>  <ww:head />  </head>  <body>  <!--  如果想统一的显示所有的erro打开下边这句  <ww:fielderror />  如果想显示其中一个error打开下边这句,默认显示在字段的正上方  <ww:fielderror>  <ww:param value="%{'name'}" />  </ww:fielderror>  <ww:fielderror>  <ww:param>desc</ww:param>  </ww:fielderror>  -->  <ww:form name="test" namespace="/" action="dbadmin" method="post" validate="true">  <ww:actionmessage />  <ww:actionerror/>  <ww:textfield label="name" name="name" />  <ww:date id="strcurrdate" name="currdate" format="yyyy-mm-dd" />  <ww:datepicker name="currdate" id="currdate" showstime="true"  format="%y-%m-%e %h:%m" cssclass="tx" language="zh" required="true"  |