您的位置:首页 > 编程语言 > Java开发

Struts2验证框架深度解析

2012-09-11 21:39 337 查看
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>

//Action的validation.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>

//另一个Action的validation.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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: