本系列博客汇总在这里:​​Struts2 汇总​


数据验证




源码工程文件为:struts2_11、struts2_12


一、验证的方式

1、客户端校验

使用 js 结合正则表达式来校验,不和服务器打交道,开发简单,安全性差。

2、服务器端校验

请求 web 服务器,开发量比较大,安全性好,如果需要和数据库到交到的就必须要使用服务器端校验。

实际开发中,客户端校验比较多,最好是客户端和服务端都校验,Struts2 的校验属于服务器端校验。

二、struts2 编程式验证

1、编程校验

重写父类的 validate 方法,在这个方法中对每一个字段来做校验,但是校验的前提是提交过来的参数是能相互转换的,如果转换不了的话会由 param,modelDriven 拦截器来负责。如果参数不符合正则,我们可以添加提示信息,例如:​​addFieldError("id", "id必须是1到5位的数字")​​。

@Override
public void validate()
{
if (person.getId() != 0 && !(person.getId() + "").matches("\\d{1,3}"))
{
addFieldError("id", "id必须是1到5位的数字");
}
if (!person.getName().matches("[a-zA-Z]{3,8}"))
{
// 添加提示信息,第一个参数表单中文本域的name,第二个是提示信息
addFieldError("name", "姓名只能是3-8位大小写字母");
}
}

Struts2(10)_Struts2 数据验证_Struts2

Struts2(10)_Struts2 数据验证_xml_02

特别提示:需要特别注意类型转换错误!

跳出校验


  • 在编程式校验中 validate 会对当前的 Action 中的每一个方法做校验,那么有一些方法时不需要校验的,我们可以通过 @skipValidation 来跳过校验。
    Struts2(10)_Struts2 数据验证_校验器_03
  • 我们在 Action 中定义一个验证方法,命名规则是:​​validate+ 要验证的方法名​​,那么这个方法就会被校验如validateSave,save 方法就会被校验,其余的方法都不会被校验。
    Struts2(10)_Struts2 数据验证_校验器_04

2、struts2 声明式验证


  • 为了解决 Action 和验证逻辑的高耦合,我们可以使用声明式验证,我们要把验证规则配置在 xml 中。
  • 规则:在 Action 的同级包下创建一个 xml,名称规范:​​Action名称-validation.xml​​。

(1)打开 xwork-validator1.0.3.dtd,把头信息拷贝到我们的 xml 中。

Struts2(10)_Struts2 数据验证_Struts2_05

(2)对验证做配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>
<!--
field:表单中要提交的文本域
name:文本域的name
-->
<field name="name">
<!--
文本域的验证器
-->
<field-validator type="requiredstring">
<message>姓名不能为空</message>
</field-validator>
</field>
</validators>

3、struts2 的验证器


  • Struts2 框架给我们提供了很多验证器,这些验证器的位置在:
    ​xwork-core.2.3.15.jar/com/opensymphony/xwork2/validator/validators/default.xml​​。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Definition 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<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>

系统提供的校验器如下:
① required:必填校验器,要求被校验的属性值不能为 null。
requiredstring :必填字符串校验器,要求被校验的属性值不能为 null,并且长度大于0,默认情况下会对字符串去前后空格。
③ stringlength:字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength 参数指定最小长度,maxLength 参数指定最大长度,trim 参数指定校验 field 之前是否去除字符串前后的空格。
regex:正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression 参数指定正则表达式,caseSensitive 参数值。
⑤ int:整数校验器,要求 field 的整数值必须在指定范围内,min 指定最小值,max 指定最大值。
⑥ double:双精度浮点数校验器,要求 field 的双精度浮点数必须在指定范围内,min 指定最小值,max 指定最大值。
⑦ fieldexpression:字段 OGNL 表达式校验器,要求 field 满足一个 ognl 表达式,expression 参数指定 ognl 表达式,该逻辑表达式基于 ValueStack 进行求值,返回 true 时校验通过,否则不通过。
⑧ email:邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址。
⑨ url:网址校验器,要求如果被校验的属性值非空,则必须是合法的 url 地址。
⑩ date:日期校验器,要求 field 的日期值必须在指定范围内,min 指定最小值,max 指定最大值。
⑪ conversion:转换校验器,指定在类型转换失败时,提示的错误信息。
⑫ visitor:用于校验 action 中复合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性。
⑬ expression:OGNL 表达式校验器,它是一个非字段校验器, expression 参数指定 ognl 表达式,该逻辑表达式基于 ValueStack 进行求值,返回 true 时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

<!-- field:表单中要提交的文本域 name:文本域的name -->
<field name="name">
<!-- 文本域的验证器 -->
<field-validator type="requiredstring">
<message>姓名不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="regex">[a-zA-Z]{3,8}</param>
<message>姓名必须是3到8位的字符</message>
</field-validator>
</field>
<!-- 第二种验证的配置方式 -->
<validator type="regex">
<!-- 配置验证的字段 -->
<param name="fieldName">password</param>
<!-- 验证的正则表达式 -->
<param name="regex">\d{6,8}</param>
<message>请输入6到8位数字的密码</message>
</validator>
<validator type="expression">
<param name="fieldName">repassword</param>
<param name="expression">password == repassword</param>
<message>两次密码必须一致</message>
</validator>

<field name="age">
<field-validator type="int">
<param name="min">0</param>
<param name="max">150</param>
<message>年龄必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>
Struts2(10)_Struts2 数据验证_Struts2_06Struts2(10)_Struts2 数据验证_校验器_07

如有错误,欢迎指正!