Struts2Validator

Action配置中一定要设置input返回页面

添加验证只要创建验证的xml文件

1.创建xml文件名

验证Action中全部方法

在Action同包下,创建:Action类名-validation.xml
如:ValidateAction创建ValidateAction-validation.xml

验证Action中单个方法

<!-- 每个方法单独配置一个Action -->  <!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml -->  
<action name="validateAdd" class="com.struts2.validator.ValidateAction" method="add">  
<!-- 要创建ValidateAction-validateAdd-validation.xml -->   
 <!-- 使用通配符配置 -->  
<!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml --> 
 <action name="validate_*" class="com.struts2.validator.ValidateAction" method="{1}">  
<!-- 要创建ValidateAction-validate_add-validation.xml,validate_add为访问这个action方法的路径 -->
 

注意事项

注意:  1.要验证的方法不能叫input.  
          2.这样配置在form表单中要在<s:form action="validate_add">中action写好名称,  不能写action="validate_",
然后<s:submit value="提交"method="add" />   这样会找不到对应的配置文件,跳过验证.  
          3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口,  
然后prepare()方法里初始化添加页面需要的值.  
         4.如果使用Preparable接口,必须在action配置中添加<interceptor-ref name="paramsPrepareParamsStack" />.  
这样prepare()才能得到form提交的参数.

2.创建xml内容

 <!DOCTYPE validators PUBLIC  "-//OpenSymphony Group//XWork Validator 1.0.2//EN"  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">    <validators>           <!-- 要验证的字段名称 -->         
 <!-- 要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action中的变量名) -->      <field name="mail">          <!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. -->          <!-- field-validator下面可以有多个param元素,但是最多只能有一个message -->          <field-validator type="requiredstring">              <param name="trim">true</param>              <message>Please enter a mail</message>          </field-validator>          <field-validator type="email">                  <message>                          Invalid MAIL                  </message>          </field-validator>      </field>  </validators>

Struts内建验证程序(type的值)

required

保证字段的值不是空值null.空字符串不是空值null.

<field name="userName">      
 <field-validator type="required"> 
         <message>Please enter a user name</message>
      </field-validator>  
</field>

requiredstring

保证字段不是空值null,也不是空白(empty).
param:trim(boolean) ->true->去除前后空格

<field name="userName"> 
     <field-validator type="requiredstring">
          <param name="trim">true</param>
          <message>Please enter a user name</message>
      </field-validator>  </field>  <field name="password"> 
     <field-validator type="requiredstring">
          <param name="trim">false</param>
          <message>Please enter a password</message>
      </field-validator>
  </field>

int

验证字段值是否可以转换为一个整数.
param: min(int);max(int)

 <field name="yeaar"> 
         <field-validator type="int"> 
             <param name="min">1999</param>
               <param name="max">2010</param> 
             <message>year:1999-2010</message>
          </field-validator> 
 </field>

date

验证给定日期字段的值是否在一个给定的范围内.
param:max(date);min(date)

 <field name="borthday">  
        <field-validator type="int"> 
             <!-- 格式取决于当前地理时区 --> 
             <param name="min">1999-01-01</param> 
              <param name="max">2010-01-01</param>
              <message>birthday:1999-2010</message>
          </field-validator>
  </field>

email

给定的String值是否是一个电子邮件地址

<field name="email">  
    <field-validator type="email">  
        <message>Invalid email</message>   
   </field-validator>
  </field>

url

给定的String值是否是一个合法的URL(要有前缀)

<field name="url">
      <field-validator type="url">
          <message>Invalid URL</message>
      </field-validator> 
 </field>

expression,fieldexpression

验证给定字段是否满足一个OGNL表达式.
区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用<s:actionerror/>才显示出错信息)
fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)
param:expression(String)OGNL表达式

expression:

public class ExpressionTestAction {  
        //属性生成get,set  
    private int min;  
    private int max;  
}  
<validator type="expression"> 
     <param name="expression"> 
         max > min 
     </param> 
     <message>          Maximum temperature must be greater than Minimum temperature      </message>
  </validator>  
  <!-- jsp -->  <s:actionerror/>

fieldexpression:

public class FieldExpressionTestAction {  
        //属性生成get,set 
     private int min;  
    private int max;
  }  
<!-- 对字段验证 -->
  <field name="max">
      <field-validator type="fieldexpression">
          <param name="expression">
              max > min 
         </param>  
        <message>              Maximum temperature must be greater than Minimum temperature          </message>
      </field-validator> 
 </field>

visitor

把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)

//UserBean  public class UserBean {
          //属性get,set 
         private String name;
          private int age;
  } 
   //UserBean-validation.xml(和UserBean放在同一个包中) 
 <field name="name"> 
     <field-validator type="requiredstring">
          <message>用户名必须</message> 
     </field-validator>
  </field>
  <field name="age"> 
     <field-validator type="int">  
        <param name="min">18</param>
          <param name="max">99</param>
          <message>Age must be between 18 and 99</message> 
     </field-validator>
  </field> 
   //Actionvalidation.xml 
 <!-- userBean变量名 --> 
 <field name="userBean">
      <field-validator type="visitor"> 
         <!-- message会和UserBean验证中的message一起显示 --> 
         <message>用户: </message> 
     </field-validator>
  </field>

如果另一个Action对UserBean使用另一个标准的验证,可以创建新的验证文件

//UserBean-specific-validation.xml
  <!-- 和之前的验证不同 -->
  <field name="age"> 
     <field-validator type="int">
          <param name="min">30</param> 
         <param name="max">50</param> 
         <message>Age must be between 30 and 50</message>
      </field-validator>
  </field> 
 //另一个Actionvalidation.xml 
 <field name="userBean">
      <field-validator type="visitor"> 
         <!-- xml中扩展的名字,执行UserBean-specific-validation.xml的验证 -->  
        <param name="context">specific</param>
          <message>用户1: </message> 
     </field-validator>
  </field>

conversion

检查对某个属性进行类型转换是否会导致一个转换错误

<field name="age">
      <field-validator type="conversion">   
       <message>              An age must be an integer.          </message> 
     </field-validator>
  </field>

stringlength

验证一个非空的字段值是不是足够的长度
param:minLength(int);maxLength(int);trim(boolean)

 <field name="password">  
        <field-validator type="requiredstring"> 
             <param name="minLength">6</param> 
              <param name="maxLength">14</param> 
             <message>length:6-14</message>  
        </field-validator> 
 </field>

regex

给定的值是否与一个给定的正则表达式匹配
param:expression(String)正则表达式;caseSensitive(boolean)是否区别大小写,默认为true;trim(boolean)是否去除前后空格

<field name="phone"> 
     <field-validator type="regex"> 
         <param name="expression">
              <![CDATA[/d/d/d/-/d/d/d/-/d/d/d/d]]> 
         </param> 
         <message>              Invalid phone number or invalid format          </message> 
     </field-validator>
  </field>

3.在action中验证

利用Validateable接口实现验证,实现void validate()方法.
ActionSupport类已经实现了这个接口

//继承ActionSupport  
public class User extends ActionSupport {
      //属性get,set 
     private String userName;
      private String password;
      private static List<String> userNames = new ArrayList<String>(); 
     static { 
         userNames.add("harry");
          userNames.add("sally");
      }
      //验证方法
      public void validate() {
          if (userNames.contains(userName)) {
                          //添加出错信息
              addFieldError("userName",  "'" + userName + "' has been taken."); 
         }
      }
  }

4.自定义验证类

要创建一个普通的验证程序(非字段验证程序),扩展ValidatorSupport类.验证失败要从validate方法调用addActionError方法.
要创建一个字段验证程序,扩展FieldValidatorSupport类.验证失败要从validate方法调用addFieldError方法.
如果要能接受参数,要在类中定义一个相应的属性,并生成get,set.

编写类

public class StrongPasswordValidator extends FieldValidatorSupport {
          //属性 
     private int minLength = -1; 
     public void setMinLength(int minLength) {  
        this.minLength = minLength;
      } 
     public int getMinLength() { 
         return minLength; 
     } 
         //验证方法 
     public void validate(Object object) throws ValidationException { 
         String fieldName = getFieldName(); 
         String value = (String) getFieldValue(fieldName, object);
          if (value == null || value.length() <= 0) {
              // use a required validator for these
              return;
          } 
         if ((minLength > -1) && (value.length() < minLength)) {
              addFieldError(fieldName, object);
          } else if (!isPasswordStrong(value)) {  
            addFieldError(fieldName, object); 
         }
      }
            private static final String GROUP_1 = "abcdefghijklmnopqrstuvwxyz";
      private static final String GROUP_2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     private static final String GROUP_3 = "0123456789";
      protected boolean isPasswordStrong(String password) { 
         boolean ok1 = false;
          boolean ok2 = false; 
         boolean ok3 = false; 
         int length = password.length();
          for (int i = 0; i < length; i++) {
              if (ok1 && ok2 && ok3) {
                  break;              
}              
String character = password.substring(i, i + 1); 
             System.out.println("character:" + character); 
             if (GROUP_1.contains(character)) {
                  ok1 = true; 
                 continue;
              } 
             if (GROUP_2.contains(character)) { 
                 ok2 = true; 
                 continue; 
             }
              if (GROUP_3.contains(character)) { 
                 ok3 = true; 
             } 
         } 
         return (ok1 && ok2 && ok3); 
     } 
     }

注册xml

在src下创建validators.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC  "-//OpenSymphony Group//XWork Validator Config 1.0//EN"  "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"> 
   <validators> 
         <!-- 名称(type对应值),类路径 --> 
     <validator name="strongpassword"  class="com.validator.StrongPasswordValidator"/>
  </validators>

使用验证

<field name="password"> 
     <field-validator type="strongpassword"> 
         <param name="minLength">8</param>
          <message>              Password must be at least 8 characters long              and contains at least one lower case character,              one upper case character, and a digit.          </message>
      </field-validator>
  </field>
 

你可能感兴趣的:(Struts2Validator)