走进Struts2(三)— 验证器

一个好的验证框架必须要考虑的事情:

验证功能的复用性。

验证功能的可扩展性。

验证与业务逻辑分离

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

几种常用的验证器,解析

<!-- 必填校验 -->
  <!-- 非字段校验 -->
  <validator type="required">
      <param name="fidleName">field</param>
      <message>请输入数据</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="required">
          <message>请输入数据</message>
      </field-validator>
  </field>   

  <!-- 必填字符串校验 -->
  <!-- 非字段校验 -->
  <validator type="requiredstring">
      <param name="fidleName">field</param>
      <param name="trim">true</param>
      <message>请输入数据</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="requiredstring">
          <param name="trim">true</param>
          <message>请输入数据</message>
      </field-validator>
  </field>   

  <!-- 整数校验 -->
  <!-- 非字段校验 -->
  <validator type="int">
      <param name="fidleName">field</param>
      <param name="min">1</param>
      <param name="max">80</param>
      <message>数字必须在${min}-${max}岁之间</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="int">
          <param name="min">1</param>
          <param name="max">80</param>
          <message>数字必须在${min}-${max}岁之间</message>
      </field-validator>
  </field>   

  <!-- 浮点校验 -->
  <!-- 非字段校验 -->
  <validator type="double">
      <param name="fidleName">field</param>
      <param name="minExclusive">0.1</param>
      <param name="maxExclusive">10.1</param>
      <message>输入浮点无效</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="double">
          <param name="minExclusive">0.1</param>
          <param name="maxExclusive">10.1</param>
          <message>输入浮点无效</message>
      </field-validator>
  </field>   

  <!-- 日期校验 -->
  <!-- 非字段校验 -->
  <validator type="date">
      <param name="fidleName">field</param>
      <param name="min">2009-01-01</param>
      <param name="max">2019-01-01</param>
      <message>日期无效</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="date">
         <param name="min">2009-01-01</param>
         <param name="max">2019-01-01</param>
         <message>日期无效</message>
      </field-validator>
  </field>   

  <!-- 表达式校验 -->
  <!-- 非字段校验 -->
  <validator type="expression">
      <param name="expression">password==repassword</param>
          <message>两者输入不一致</message>
  </validator>   

  <!-- 字段表达式校验 -->
  <!-- 非字段校验 -->
  <validator type="fieldexpression">
      <param name="expression">password==repassword</param>
      <message>两者输入不一致</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="fieldexpression">
          <param name="expression"><![CDATA[#password==#repassword]]></param>
          <message>两者输入不一致</message>
      </field-validator>
  </field>   

  <!-- 邮件校验 -->
  <!-- 非字段校验 -->
  <validator type="email">
      <param name="fidleName">field</param>
      <message>非法邮件地址</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="email">
          <message>非法邮件地址</message>
      </field-validator>
  </field>   

  <!-- 网址校验 -->
  <!-- 非字段校验 -->
  <validator type="url">
      <param name="fidleName">field</param>
      <message>无效网址</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="url">
          <message>无效网址</message>
      </field-validator>
  </field>   

  <!-- visitor校验 -->
  <!-- 非字段校验 -->
  <validator type="visitor">
      <param name="fidleName">field</param>
      <param name="context">fieldContext</param>
      <param name="appendPrefix">true</param>
      <message>输入校验</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="visitor">
          <param name="context">fieldContext</param>
          <param name="appendPrefix">true</param>
          <message>输入校验</message>
      </field-validator>
  </field>   

  <!-- 类型转换校验 -->
  <!-- 非字段校验 -->
  <validator type="conversion">
      <param name="fidleName">field</param>
      <message>类型转换错误</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="conversion">
          <message>类型转换错误</message>
      </field-validator>
  </field>   

  <!-- 字符串长度校验 -->
  <!-- 非字段校验 -->
  <validator type="stringlength">
      <param name="fidleName">field</param>
      <param name="minLength">1</param>
      <param name="maxLength">10</param>
      <param name="trim">true</param>
      <message>字符串长度必须为10位</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="stringlength">
          <param name="minLength">1</param>
          <param name="maxLength">10</param>
          <param name="trim">true</param>
          <message>字符串长度必须为10位</message>
      </field-validator>
  </field>   

  <!-- 正则表达式校验 -->
  <!-- 非字段校验 -->
  <validator type="regex">
      <param name="fidleName">field</param>
      <param name="regexExpression"><![CDATA[(/^13[13567890](\d{8})$/)]]></param>
      <message>手机号码必须为数字并且是11位</message>
  </validator>
  <!-- 字段校验 -->
  <field name="field">
      <field-validator type="regex">
          <param name="regexExpression"><![CDATA[(/^13[13567890](\d{8})$/)]]></param>
          <message>手机号码必须为数字并且是11位</message>
      </field-validator>
  </field> 

验证器的验证时机:

验证发生在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 的版本才能正确执行验证器短路。

时间: 2024-10-02 05:00:08

走进Struts2(三)— 验证器的相关文章

自定义验证器——用Struts2框架以框架师的思维灵活做好该事情

面对的问题:自定义一个18位身份验证器,编写验证器,在validators.xml文件中进行注册.在验证配置文件中使用? 第一部分:理解Struts2中自带的验证器 第二部分:怎样通过服务器(后台),再次对前台的数据进行验证 第三部分:用Struts2来自定义验证器(问题解决方案) 第一部分:理解Struts2中自带的验证器 Struts2框架中自带的后台服务器验证分为两种:声明式验证和编程式验证 u  声明式验证(重点) ?  对哪个 Action 或 Model 的那个字段进行验证 ?  使

走进Struts2(二) — Struts2的基石(拦截器)

拦截器(Interceptor)是Struts2的基石,拦截器的主要作用是在Action执行之前和Result执行之后进行一些特定功能的处理机制. 如图,拦截器是用来负责在Action执行之前和Result执行之后处理一些功能的类.每个不同的拦截器,它们分别执行不同的功能处理,而运行的时机就是在Action执行之前和Result执行之后,需要注意的是在执行Action之前和Result之后,拦截器的执行顺序是正好相反的. 一.拦截器的好处 1.简化Action的实现,可以把很多功能从Action

自己定义验证器——用Struts2框架以框架师的思维灵活做好该事情

面对的问题:自己定义一个18位身份验证器.编写验证器.在validators.xml文件里进行注冊.在验证配置文件里使用? 第一部分:理解Struts2中自带的验证器 第二部分:如何通过server(后台).再次对前台的数据进行验证 第三部分:用Struts2来自己定义验证器(问题解决方式) 第一部分:理解Struts2中自带的验证器 Struts2框架中自带的后台server验证分为两种:声明式验证和编程式验证 u  声明式验证(重点) ?  对哪个 Action 或 Model 的那个字段进

Struts2的输入验证(四)-自定义验证器与编程式验证

一.自定义验证器 1.实现步骤: 1)定义一个验证器的类 自定义验证器必须实现 Validator 接口,由于ValidatorSupport 和 FieldValidatorSupport 实现了 Validator 接口,因此可以继承ValidatorSupport 或 FieldValidatorSupport Ⅰ. 若需要普通的验证程序,可以继承 ValidatorSupport 类: Ⅱ. 若需要字段验证程序,可以继承 FieldValidatorSupport 类: Ⅲ. 若验证程序

struts2验证器

1. Struts2 的验证(note6,struts2-8) 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >> 使用什么验证规则 >> 如果验证失败, 转向哪一个页面, 显示是什么错误消息 > 编程式验证 2). 声明式验证的 helloworld I. 先明确对哪一个 Action 的哪一个字段进行验证: ageII. 编写配置文件: > 把 struts-2.3.15.3\apps\s

自定义基于XML的验证器

1 a.编写一个类,继承FieldValidatorSupport类. 2 b.在public void validate(Object object)编写你的验证逻辑 3 不符合要求的就向fieldErrors中放消息 4 String fieldName=getFieldName(); 5 String fieldValue=(String) getFieldValue(fieldName, object); 6 c.一定注册你的验证器才能使用在src底下建立validators.xml定义

走进Struts2(一) — Struts2的执行流程及其工作原理

 Struts2是一套很优秀的Web应用框架,实现优雅.功能强大.使用简洁.能够说是Struts2是一款很成熟的MVC架构. 在我们学习Struts2时,最好是先学习它的执行流程.核心概念.从中得到启示.提升自己,而不不过学习怎么怎么使用它. 在网上看到这样一句话: 你千万不要成为一个仅仅会熟练使用框架的程序猿.那样.你会疲于奔命,你或许永远仅仅会使用 Hadoop ,而写不出一个 Hadoop ,你仅仅是一个 Hadoop程序猿,而不是一个分布式project师. 你或许永远仅仅会使用 Str

Struts2数据验证机制

1. 手动验证的实现 只需要在继承ActionSupport类的情况下,直接重写validate()方法即可.使用validate()方法可以对用户请求的多个Action方法进行验证,但其验证的逻辑是相同的.如果在一个Action类中编写了多个请求处理方法,而此Action重写了validate()方法,那么,默认情况下,在执行每个请求方法的过程中,都会经过validate()方法的验证处理. 2. 验证文件的命名规则 使用Struts2验证框架,验证文件的名称需要遵循一定的命名规则,其验证文件

Struts2 自定义拦截器时Action无法接收到参数

问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultStack中也有细分如basicStack等 <interceptors> <interceptor name="checkUser" class="com.common.interceptor.UserInfoInterceptor"></