本系列博客汇总在这里: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位大小写字母");
}
}
特别提示:需要特别注意类型转换错误!
跳出校验
- 在编程式校验中 validate 会对当前的 Action 中的每一个方法做校验,那么有一些方法时不需要校验的,我们可以通过 @skipValidation 来跳过校验。
- 我们在 Action 中定义一个验证方法,命名规则是:
validate+ 要验证的方法名
,那么这个方法就会被校验如validateSave,save 方法就会被校验,其余的方法都不会被校验。
2、struts2 声明式验证
- 为了解决 Action 和验证逻辑的高耦合,我们可以使用声明式验证,我们要把验证规则配置在 xml 中。
- 规则:在 Action 的同级包下创建一个 xml,名称规范:
Action名称-validation.xml
。
(1)打开 xwork-validator1.0.3.dtd,把头信息拷贝到我们的 xml 中。
(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>
如有错误,欢迎指正!