首页 > 代码库 > Struts2的输入验证(四)-自定义验证器与编程式验证
Struts2的输入验证(四)-自定义验证器与编程式验证
一、自定义验证器
1、实现步骤:
1)定义一个验证器的类
自定义验证器必须实现 Validator 接口,由于ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口,因此可以继承ValidatorSupport 或 FieldValidatorSupport
Ⅰ. 若需要普通的验证程序,可以继承 ValidatorSupport 类;
Ⅱ. 若需要字段验证程序,可以继承 FieldValidatorSupport 类;
Ⅲ. 若验证程序需要接受一个输入参数,需要为这个参数增加一个相应的属性。
2)在配置文件中配置(注册)验证器
注册验证程序:自定义验证器需要在类路径里的某个 validators.xml 文件里注册。
默认情况下下,Struts2 会在 类路径的根目录下加载 validators.xml 文件,在该文件中加载验证器。该文件的定义方式与Struts2内建的默认验证器的配置文件相同(即位于 com.opensymphony.xwork2.validator.validators 下的 default.xml),如下图:
2、示例:自定义验证器
要求:自定义一个 18 位身份证验证器
1)编写验证器类IDCardValidator:
1 package com.atguigu.struts2.validation.app; 2 import com.opensymphony.xwork2.validator.ValidationException; 3 import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; 4 public class IDCardValidator extends FieldValidatorSupport { 5 @Override 6 public void validate(Object object) throws ValidationException { 7 //1. 获取字段的名字和值 8 String fieldName = getFieldName(); 9 Object value = http://www.mamicode.com/this.getFieldValue(fieldName, object); 10 //2. 验证11 IDCard idCard = new IDCard();12 boolean result = idCard.Verify((String)value); 13 //3. 若验证失败, 则 ...14 if(!result){15 addFieldError(fieldName, object);16 } 17 }18 }19 20 //===下面是IDCard类===21 package com.atguigu.struts2.validation.app;22 public class IDCard {23 final int[] wi = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };24 final int[] vi = { 1, 0, ‘X‘, 9, 8, 7, 6, 5, 4, 3, 2 };25 private int[] ai = new int[18];26 public IDCard() {}27 public boolean Verify(String idcard) {28 if (idcard.length() == 15) {29 idcard = uptoeighteen(idcard);30 }31 if (idcard.length() != 18) {32 return false;33 }34 String verify = idcard.substring(17, 18);35 if (verify.equals(getVerify(idcard))) {36 return true;37 }38 return false;39 }40 public String getVerify(String eightcardid) {41 int remaining = 0;42 if (eightcardid.length() == 18) {43 eightcardid = eightcardid.substring(0, 17);44 }45 if (eightcardid.length() == 17) {46 int sum = 0;47 for (int i = 0; i < 17; i++) {48 String k = eightcardid.substring(i, i + 1);49 ai[i] = Integer.parseInt(k);50 }51 for (int i = 0; i < 17; i++) {52 sum = sum + wi[i] * ai[i];53 }54 remaining = sum % 11;55 }56 return remaining == 2 ? "X" : String.valueOf(vi[remaining]);57 }58 public String uptoeighteen(String fifteencardid) {59 String eightcardid = fifteencardid.substring(0, 6);60 eightcardid = eightcardid + "19";61 eightcardid = eightcardid + fifteencardid.substring(6, 15);62 eightcardid = eightcardid + getVerify(eightcardid);63 return eightcardid;64 }65 }
2)在src目录下建立 validators.xml 文件,并在其中进行注册自定义的验证器
<validators> <validator name="idcard" class="com.atguigu.struts2.validation.app.IDCardValidator"/></validators>
3)在验证配置文件中使用
<validators> <field name="idCard"> <field-validator type="idcard"> <message>It is not a idCard!</message> </field-validator> </field></validators>
二、编程式验证
Struts2 提供了一个 Validateable 接口,可以使 Action 类实现这个接口以提供编程式验证功能。
ActionSupport 类已经实现了 Validateable 接口,因此通过继承ActionSupport类可间接实现Validateable接口。
示例如下,判断name是否为空:
注:该Struts2学习教程来自尚硅谷-佟刚-Struts2教程,感谢尚硅谷及佟刚老师的分享。
Struts2的输入验证(四)-自定义验证器与编程式验证