struts的验证器是用的xwork里面的验证自定义验证器就是根据源码继承已有的字段验证器而来具体步骤如下:
展开xworkjarcomopensymphonyxwork
validatorvalidators目录下有个defaultxml将它复制到项目根目录下改名叫validatorsxml
验证框架首先在根目录下找validatorsxml文件没找到validatorsxml文件验证框架将调用默认的验证设置即defaultxml里面的配置信息
新建一个类(身份证验证为例:类名CardIdFieldValidator)继承FieldValidatorSupport实现validate方法
package monsvalidators;
import comopensymphonyxworkvalidatorValidationException;
import comopensymphonyxworkvalidatorvalidatorsFieldValidatorSupport;
public class CardIdFieldValidator extends FieldValidatorSupport{
public void validate(Object object) throws ValidationException
{
// 获得字段的名字
String fieldName = getFieldName();
// 获得输入界面输入的值
String value = getFieldValue(fieldName object)toString();
if (value == null || valuelength() <= )
return;
if(valuelength()!= && valuelength()!= )//身份证必须是或位!
addFieldError(fieldName object);
if(valuelength()==)
validateCardId(value object);
if(valuelength()==)
validateCardId(value object);
}
/** *//**
* <p>位身份证验证</p>
*
* 根据〖中华人民共和国国家标准 GB 〗中有关公民身份号码的规定公民身份号码是特征组合码由十七位数字本体码和一位数字校验码组成
* 排列顺序从左至右依次为六位数字地址码八位数字出生日期码三位数字顺序码和一位数字校验码
*
* 第十八位数字(校验码)的计算方法为
* 将前面的身份证号码位数分别乘以不同的系数从第一位到第十七位的系数分别为
* 将这位数字和系数相乘的结果相加
* 用加出来和除以看余数是多少?
* 余数只可能有 这个数字其分别对应的最后一位身份证的号码为 X
* 通过上面得知如果余数是就会在身份证的第位数字上出现罗马数字的Ⅹ如果余数是身份证的最后一位号码就是
*
* @date Oct
* @param value
* @param object
*/
public void validateCardId(String value Object object)
{
// 获得字段的名字
String fieldName = getFieldName();
String tempStr = valuesubstring();
String sourceCheckCode = valuesubstring();
String checkCode = ;
int[] a = new int[];
int i = ;
try
{
while(i<){
a[i] = IntegerparseInt(tempStrsubstring(ii+));
i++;
}
} catch (NumberFormatException e)
{
addFieldError(fieldName object);
}
int mod = (a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*
+a[]*+a[]*+a[]*+a[]*+a[]*+a[]*)%;
switch (mod){
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
case
: checkCode = x;
break;
case :
checkCode = ;
break;
case :
checkCode = ;
break;
}
if(!sourceCheckCodeequalsIgnoreCase(checkCode))
addFieldError(fieldName object);
}
/** *//**
* <p>位身份证验证</p>
*
* 只做了数字验证
* @date Oct
* @param value
* @param object
*/
public void validateCardId(String value Object object)
{
String fieldName = getFieldName();
int i = ;
try
{
while(i<){
if(!CharacterisDigit(valuecharAt(i)))
addFieldError(fieldName object);
i++;
}
} catch (NumberFormatException e)
{
addFieldError(fieldName object);
}
}
}
在validatorsxml中添加一个validator节点和其他validator一样指定名称和类名这里指定的name就是你将来要是使用的类型名字
<validator name=cardid class=monsvalidatorsCardIdFieldValidator/>到此自定义验证器就完成剩下的就和使用自带的验证器一样了
新建action继承ActionSupport或Action都行写上相应需要验证的属性字段
新建验证文件xxxxvalidationxml这个xxxx就是你前面action的类名字xxxxxxvalidationxml第二个xxx表示是jsp中的form提交action
<field name=studentsfzh>
<fieldvalidator type=requiredstring shortcircuit=true>
<message>身份证号不能为空</message>
</fieldvalidator>
<fieldvalidator type=cardid>
<message>身份证号格式不正确</message>
</fieldvalidator>
</field>配置strutsxml以及action