struts2之声明式验证

struts2框架中提供大量的内置校验器,使用时只需对这些校验进行配置,我们管这种方式叫做声明验证。其实这个流程和之前介绍的编程验证是一样的,可以参考之前输入验证的流程。


一.编写配置文件:
文件名为ActionClassName-validation.xml,与要验证属性的Action在同一目录下,编写验证的规则可以参见 struts-2.3.4/docs/WW/validation.html文档。

这些验证器的配置有两种方式:字段验证 和 非字段验证。字段验证字段优先,可以为一个字段配置多个验证规则;非字段验证验证规则优先,不只针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。

先以注册的逻辑为例看一下这两种方式(以requiredstring验证为例):

Action类:

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private String name;
	private String password;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	@Override
	public String execute() throws Exception {
		System.out.println(name+password);
		return SUCCESS;
	}
	
}

配置action:

<action name="register" class="com.struts.validate.RegisterAction">
        <result name="success">/success.jsp</result>
        <result name="input">/register.jsp</result>
</action>
配置验证:

<?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-validator type="requiredstring">
			<message>姓名不能为空</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring">
			<message>密码不能为空</message>
		</field-validator>
	</field>
	-->
	
	<!-- 非字段验证 -->
	<validator type="requiredstring">
		<param name="fieldName">name</param>
		<message>姓名不能为空</message>
	</validator>
	<validator type="requiredstring">
		<param name="fieldName">password</param>
		<message>密码不能为空</message>
	</validator>

</validators>

jsp页面:

<s:form action="register">
		<s:textfield name="name" label="name"></s:textfield>
		<s:password name="password" label="password"></s:password>
	
		<s:submit></s:submit>
	</s:form>

两种配置方式的结果都一样:


那么我们可以比较一下这两种方式:

前面说过struts2中的转换器有两种配置方式,一种是基于字段转换,另一种是基于类型的转换。我觉得可以类比一下,字段验证先指定校验的属性,非字段验证先指定校验器。


二.几种常用验证器的简单例子

Action类:

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private String name;
	private int age;
	private Date birth;
	private String email;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String execute() throws Exception {
		System.out.println("name="+name+"  age="+age+"  birth="+birth
				+" email="+email);
		return SUCCESS;
	}
	
}

配置action:

<action name="regValidate" class="com.struts.validatetype.RegisterAction">
       	<result name="success">/success.jsp</result>
       	<result name="input">/regvalidate.jsp</result>
</action>

配置验证:

<?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">
		<!-- requiredstring:确保某给定字段的值既不是空值 null, 也不是空白. 
			trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格. 
		 -->
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message>姓名不能为空</message>
		</field-validator>
		<!-- stringlength: 验证一个非空的字段值是不是有足够的长度. 
			minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制
			maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制
			trim: 在验证之前是否去除前后空格
		 -->
		<field-validator type="stringlength">
			<param name="maxLength">15</param>
			<param name="minLength">6</param>
			<message>姓名长度在${minLength}与${maxLength}之间</message>
		</field-validator>
	</field>
	<field name="age">
		<!-- int:检查给定整数字段值是否在某一个范围内
			min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
			max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
		 -->
		<field-validator type="int">
			<param name="max">30</param>
			<param name="min">20</param>
			<message>年龄必须在${min}与${max}之间</message>
		</field-validator>
	</field>
	<field name="birth">
		<!-- date: 确保某给定日期字段的值落在一个给定的范围内
			max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
			min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制 -->
		<field-validator type="date">
			<param name="min">1970-1-1</param>
			<param name="max">2000-12-12</param>
			<message>生日应在${min}与${max}之间</message>
		</field-validator>
	</field>
	<field name="email">
		<!-- email: 检查给定 String 值是否是一个合法的 email -->
		<field-validator type="email">
			<message>邮箱格式错误</message>
		</field-validator>
	</field>

</validators>

jsp页面:

<s:form action="regValidate">
	<s:textfield name="name" label="name"></s:textfield>
	<s:textfield name="age" label="age"></s:textfield>
	<s:textfield name="birth" label="birth"></s:textfield>
	<s:textfield name="email" label="email"></s:textfield>
			
	<s:submit></s:submit>
</s:form>

显示结果:


从结果中可以看出这些常用验证器已经起到了验证效果,验证器的使用及表示意义在配置验证文件中可以看到。

三.声明式验证框架的原理:

struts2 默认的拦截器栈中提供了一个 validation 拦截器,每个具体的验证规则都会对应具体的一个验证器. 有一个配置文件把验证规则名称和验证器关联起来了. 而实际上验证的是那个验证器. 该文件是com.opensymphony.xwork2.validator.validators 下的 default.xml,

截图:



声明式校验的基本配置和几种常用的校验器就总结到这,之后会一一介绍一些特殊的验证及自定义验证器,fight!!!








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值