一个好的验证框架必须要考虑的事情:
验证功能的复用性。
验证功能的可扩展性。
验证与业务逻辑分离
Struts2提供了强大的验证框架:在 xwork-core-2.3.24.jar 包下,在 \com\opensymphony\xwork2\validator\validators 路径下找一个名字为“ default.xml ”的 xml 文件一、Struts2的预定义验证器
- <validators>
- <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
- <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
- <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
- <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
- <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
- <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
- <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
- <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
- <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
- <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
- <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
- <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
- <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
- <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
- <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
- <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
- </validators>
当需要验证某些字段的时候,用户提交的个人信息等,可以在 需要验证的 xxxAction 同包下创建 ActionClassName-validation.xml,那么就会对这个Action中的所有方法都进行验证,如果只希望对Action中的某个方法起作用,那么验证文件取名为 ActionClassName-actionName-validation.xml,需要注意的是actionName是Struts.xml 中的 <action name="">的action的名称。 UserAction中有个login方法,Struts.xml中 <action name="user_login">,那么验证文件名为:UserAction-user_login-validation.xml
几种常用的验证器,解析
验证器的验证时机:验证发生在execute方法之前,在struts2 的params拦截器已经把请求的参数通过反射设置到 Action 的属性之后,所以,验证框架实际上验证的是值栈中的值
验证的结果:
如果用户输入的参数完全满足验证结果,那么会继续执行execute方法。如果不满足,会跳转到Action配置中的result name="input" 的页面中中
二、自定义验证器
检验输入的字符串中是否包含中文:
思路:
1.获取 中文 和 英文 的长度
2.比如 "哈哈" 与 "aa" 长度都是 2 ,所以无法判断,
3. 一个中文占两个字符,而英文还是占一个字节
4.所以要判断是否包含中文只需判断字节长度与字符长度是否一致即可。
- import com.opensymphony.xwork2.validator.ValidationException;
- import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
-
- public class ChineseValidator extends FieldValidatorSupport{
-
-
- public void validate(Object object) throws ValidationException {
-
-
- final String fieldName = this.getFieldName();
-
- final String fieldValue = (String) this.getFieldValue(fieldName, object);
-
- final int bytes = fieldValue.getBytes().length;
-
- final int chars = fieldValue.length();
-
- if(mode.equals("some")){
-
- if (chars==bytes||chars*2==bytes){
- this.addFieldError(fieldName, object);
- }
-
- }
- }
声明自定义的验证器在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>
- <validator name="chinese" class="xx.xxx.ChineseValidator"/>
- </validators>
PS:Struts2的2.0.8版本之前,一旦使用自定义的validators.xml文件,那么系统就不会再调用Struts2预定义的验证器,所以需要将struts2默认的内容拷贝到自定义的validators.xml中。引用自定义的验证器
在UserAction-user_login.validation.xml中
- <validators>
- <field name="username">
- <field-validator type="chinese">
-
- <message>用户账号,只能输入非中文的字符</message>
- </field-validator>
- </field>
- </validators>
在页面上显示验证错误信息字段验证器:<s:filederror>,不指定filedName,则默认显示所有的字段验证的错
动作验证器:<s:actionerror>,同上
验证器短路:
当一个字段有多个验证条件的时候,在第一次出现验证错误后,就立即终止验证,后续对这个字段的验证就不再进行了,这就叫验证器短路.
在指明验证器时,添加 short-circuit="true"
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-
- <validators>
- <field name="user.age">
- <field-validator type="int" short-circuit="true">
- <param name="min">15</param>
- <message>年龄要大于等于15岁</message>
- </field-validator>
- </field>
- </validators>
注意:只有 Validator1.0.2 的版本才能正确执行验证器短路。