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>

你可能感兴趣的:(Validator)