Just some sharing about java open source and life

Struts2使用validate方法验证数据

日期:2010-03-29 11:17 | 作者:JavaChen | 分类目录:Struts
219 views

在Struts2中最简单的验证数据的方法是使用validate。从ActionSupport类的源代码中可以看到,ActionSupport类实现了一个Validateable接口。这个接口只有一个validate方法。如果Action类实现了这个接口,Struts2在调用execute方法之前首先会调用这个方法,我们可以在validate方法中验证,如果发生错误,可以根据错误的level选择字段级错误,还是动作级错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或 Field错误,Struts2会返回“input”,如果返回了“input”,Struts2就不会再调用execute方法了。如果不存在错误信息,Struts2在最后会调用execute方法。

@Override
public void validate() {
	System.out.println("validate~~~~~~~~~~~~~~~~~~~");

	if (null == username || username.length() < 6 || username.length() > 10) {
		this.addFieldError("username", "username invalid");
	}
	if (null == password || password.length() < 6 || password.length() > 10) {
		this.addFieldError("password", "password invalid");
	} else if (null == repassword || repassword.length() < 6
			|| repassword.length() > 10) {
		this.addFieldError("repassword", "re-password invalid");
	} else if (!password.equals(repassword)) {
		this.addFieldError("password", "two passwords not the same");
	}
	if (age < 1 || age > 150) {
		this.addFieldError("age", "age invalid");
	}
	if (null == birthday) {
		this.addFieldError("birthday", "birthday invalid");
	}
	if (null == graduation) {
		this.addFieldError("graduation", "graduation invalid");
	}
	if (null != birthday && null != graduation) {
		Calendar c1 = Calendar.getInstance();
		c1.setTime(birthday);

		Calendar c2 = Calendar.getInstance();
		c2.setTime(graduation);

		if (!c1.before(c2)) {
			this.addFieldError("birthday",
					"birthday should be before graduation");
		}
	}
	if(!this.hasFieldErrors()){
		this.addActionMessage("action success");
	}else{
		this.addActionError("action error");
	}
}

ActionSupport实现了ValidationAware接口,该接口有addActionError,addFieldError,addActionMessage三个方法
前两个add方法和ActionErrors类中的add方法类似,只是add方法的错误信息需要一个ActionMessage对象,比较麻烦。除了加入错误信息外,还可以使用addActionMessage方法加入成功提交后的信息。当提交成功后,可以显示这些信息。

以上三个add方法都在ValidationAware接口中定义,并且在ActionSupport类中有一个默认的实现。其实,在 ActionSupport类中的实现实际上是调用了ValidationAwareSupport中的相应的方法,也就是这三个add方法是在 ValidationAwareSupport类中实现的,代码如下:

private final ValidationAwareSupport validationAware=new ValidationAwareSupport();
public void addActionError(String anErrorMessage)
{ validationAware.addActionError(anErrorMessage);
}
public void addActionMessage(String aMessage)
{
validationAware.addActionMessage(aMessage);
}
public void addFieldError(String fieldName,String errorMessage)
{
validationAware.addFieldError(fieldName,errorMessage);
}

在请求的页面可以使用Struts2的tag:<s:actionerror>、<s:fielderror>和<s:actionmessage>,分别用来显示动作错误信息,字段错误信息,和动作信息。如果信息为空,则不显示。

Field错误需要一个key(一般用来表示是哪一个属性出的错误),而Action错误和Action消息只要提供一个信息字符串就可以了。

我们还可以使用ValidationAware接口的其他方法(由ValidationAwareSupport类实现)获得或设置字段错误信息、动作错误信息以及动作消息。如hasActionErrors方法判断是否存在动作层的错误,getFieldErrors获得字段错误信息(一个Map对象)

当遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面类型转换与输入校验的流程。

1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)

注意:如果类型转换不成功,也同样要进行输入校验

1. 真正存放field级别错误信息的对象是LinkedHashMap
2. 该LinkedHashMap的key是String类型的,value是ArrayList类型的
3. 对于Action级别的错误信息,实际上是放置在ArrayList中的

Reblog this post [with Zemanta]
作者:JavaChen | 分类目录:Struts | 标签:
回到顶部

无觅相关文章插件,快速提升流量