zoukankan      html  css  js  c++  java
  • Struts2 Validator

    Struts2Validator 
    Struts2验证框架
     

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

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

    1.创建xml文件名

    验证Action中全部方法

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

    验证Action中单个方法

    <!-- 每个方法单独配置一个Action -->
    <!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml -->
    <actionname="validateAdd"class="com.struts2.validator.ValidateAction"method="add">
    <!-- 要创建ValidateAction-validateAdd-validation.xml -->

    <!-- 使用通配符配置 -->
    <!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml -->
    <actionname="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中的变量名) -->
       
    <fieldname="mail">
           
    <!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. -->
           
    <!-- field-validator下面可以有多个param元素,但是最多只能有一个message -->
           
    <field-validatortype="requiredstring">
               
    <paramname="trim">true</param>
               
    <message>Please enter a mail</message>
           
    </field-validator>
           
    <field-validatortype="email">
                   
    <message>
                            Invalid MAIL
                   
    </message>
           
    </field-validator>
       
    </field>
    </validators>

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

    required

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

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

    requiredstring

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

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

    int

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

     <fieldname="yeaar">
           
    <field-validatortype="int">
               
    <paramname="min">1999</param>
                 
    <paramname="max">2010</param>
               
    <message>year:1999-2010</message>
           
    </field-validator>
    </field>

    date

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

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

    email

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

    <fieldname="email">
       
    <field-validatortype="email">
           
    <message>Invalid email</message>
       
    </field-validator>
    </field>

    url

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

    <fieldname="url">
       
    <field-validatortype="url">
           
    <message>Invalid URL</message>
       
    </field-validator>
    </field>

    expression,fieldexpression

    验证给定字段是否满足一个OGNL表达式.
    区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用

    <actionerror>
    </actionerror>
    才显示出错信息)
    fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)
    param:expression(String)OGNL表达式

    expression:

    publicclassExpressionTestAction{
           
    //属性生成get,set
       
    privateint min;
       
    privateint 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:

    publicclassFieldExpressionTestAction{
           
    //属性生成get,set
       
    privateint min;
       
    privateint 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
    publicclassUserBean{
           
    //属性get,set
           
    privateString name;
           
    privateint 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 18and99</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 30and50</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

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

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

    stringlength

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

     <fieldname="password">
           
    <field-validatortype="requiredstring">
               
    <paramname="minLength">6</param>
                 
    <paramname="maxLength">14</param>
               
    <message>length:6-14</message>
           
    </field-validator>
    </field>

    regex

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

    <fieldname="phone">
       
    <field-validatortype="regex">
           
    <paramname="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
    publicclassUserextendsActionSupport{
       
    //属性get,set
       
    privateString userName;
       
    privateString password;
       
    privatestaticList<String> userNames =newArrayList<String>();
       
    static{
            userNames
    .add("harry");
            userNames
    .add("sally");
       
    }
       
    //验证方法
       
    publicvoid validate(){
           
    if(userNames.contains(userName)){
                           
    //添加出错信息
                addFieldError
    ("userName",  "'"+ userName +"' has been taken.");
           
    }
       
    }
    }

    4.自定义验证类

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

    编写类

    publicclassStrongPasswordValidatorextendsFieldValidatorSupport{
           
    //属性
       
    privateint minLength =-1;
       
    publicvoid setMinLength(int minLength){
           
    this.minLength = minLength;
       
    }
       
    publicint getMinLength(){
           
    return minLength;
       
    }
           
    //验证方法
       
    publicvoid validate(Objectobject)throwsValidationException{
           
    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);
           
    }elseif(!isPasswordStrong(value)){
                addFieldError
    (fieldName,object);
           
    }
       
    }
       
       
    privatestaticfinalString GROUP_1 ="abcdefghijklmnopqrstuvwxyz";
       
    privatestaticfinalString GROUP_2 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
       
    privatestaticfinalString GROUP_3 ="0123456789";
       
    protectedboolean 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对应值),类路径 -->
       
    <validatorname="strongpassword"  class="com.validator.StrongPasswordValidator"/>
    </validators>

    使用验证

    <fieldname="password">
       
    <field-validatortype="strongpassword">
           
    <paramname="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>

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

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

    1.创建xml文件名

    验证Action中全部方法

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

    验证Action中单个方法

    <!-- 每个方法单独配置一个Action -->
    <!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml -->
    <actionname="validateAdd"class="com.struts2.validator.ValidateAction"method="add">
    <!-- 要创建ValidateAction-validateAdd-validation.xml -->

    <!-- 使用通配符配置 -->
    <!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml -->
    <actionname="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中的变量名) -->
       
    <fieldname="mail">
           
    <!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. -->
           
    <!-- field-validator下面可以有多个param元素,但是最多只能有一个message -->
           
    <field-validatortype="requiredstring">
               
    <paramname="trim">true</param>
               
    <message>Please enter a mail</message>
           
    </field-validator>
           
    <field-validatortype="email">
                   
    <message>
                            Invalid MAIL
                   
    </message>
           
    </field-validator>
       
    </field>
    </validators>

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

    required

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

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

    requiredstring

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

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

    int

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

     <fieldname="yeaar">
           
    <field-validatortype="int">
               
    <paramname="min">1999</param>
                 
    <paramname="max">2010</param>
               
    <message>year:1999-2010</message>
           
    </field-validator>
    </field>

    date

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

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

    email

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

    <fieldname="email">
       
    <field-validatortype="email">
           
    <message>Invalid email</message>
       
    </field-validator>
    </field>

    url

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

    <fieldname="url">
       
    <field-validatortype="url">
           
    <message>Invalid URL</message>
       
    </field-validator>
    </field>

    expression,fieldexpression

    验证给定字段是否满足一个OGNL表达式.
    区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用

    <actionerror>
    </actionerror>
    才显示出错信息)
    fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证)
    param:expression(String)OGNL表达式

    expression:

    publicclassExpressionTestAction{
           
    //属性生成get,set
       
    privateint min;
       
    privateint 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:

    publicclassFieldExpressionTestAction{
           
    //属性生成get,set
       
    privateint min;
       
    privateint 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
    publicclassUserBean{
           
    //属性get,set
           
    privateString name;
           
    privateint 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 18and99</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 30and50</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

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

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

    stringlength

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

     <fieldname="password">
           
    <field-validatortype="requiredstring">
               
    <paramname="minLength">6</param>
                 
    <paramname="maxLength">14</param>
               
    <message>length:6-14</message>
           
    </field-validator>
    </field>

    regex

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

    <fieldname="phone">
       
    <field-validatortype="regex">
           
    <paramname="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
    publicclassUserextendsActionSupport{
       
    //属性get,set
       
    privateString userName;
       
    privateString password;
       
    privatestaticList<String> userNames =newArrayList<String>();
       
    static{
            userNames
    .add("harry");
            userNames
    .add("sally");
       
    }
       
    //验证方法
       
    publicvoid validate(){
           
    if(userNames.contains(userName)){
                           
    //添加出错信息
                addFieldError
    ("userName",  "'"+ userName +"' has been taken.");
           
    }
       
    }
    }

    4.自定义验证类

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

    编写类

    publicclassStrongPasswordValidatorextendsFieldValidatorSupport{
           
    //属性
       
    privateint minLength =-1;
       
    publicvoid setMinLength(int minLength){
           
    this.minLength = minLength;
       
    }
       
    publicint getMinLength(){
           
    return minLength;
       
    }
           
    //验证方法
       
    publicvoid validate(Objectobject)throwsValidationException{
           
    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);
           
    }elseif(!isPasswordStrong(value)){
                addFieldError
    (fieldName,object);
           
    }
       
    }
       
       
    privatestaticfinalString GROUP_1 ="abcdefghijklmnopqrstuvwxyz";
       
    privatestaticfinalString GROUP_2 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
       
    privatestaticfinalString GROUP_3 ="0123456789";
       
    protectedboolean 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对应值),类路径 -->
       
    <validatorname="strongpassword"  class="com.validator.StrongPasswordValidator"/>
    </validators>

    使用验证

    <fieldname="password">
       
    <field-validatortype="strongpassword">
           
    <paramname="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>
  • 相关阅读:
    iOS-Core-Animation-Advanced-Techniques(一)
    一个很有借鉴价值的编程故事
    11
    安卓学习路线
    weakSelf和strongSelf
    <二>iOS 开发Push的个人见解 图文并茂 详细到我写的想吐!!!!!!!!!
    <一>iOS 开发Push的个人见解 图文并茂 详细到我写的想吐!!!!!!!!!
    啊哈!算法 学习2 排序
    啊哈!算法 学习1 排序
    转载---CGImageSource对图像数据读取任务的抽象
  • 原文地址:https://www.cnblogs.com/eggbucket/p/2339591.html
Copyright © 2011-2022 走看看