Struts2(10)_Struts2 数据验证

本系列博客汇总在这里: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>
    
    在这里插入图片描述在这里插入图片描述

如有错误,欢迎指正!

发布了448 篇原创文章 · 获赞 210 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36260974/article/details/103709030