现在在学习李刚老师的《Struts2权威指南》,越读到后面,越是觉得这本书真的太好了!例子很丰富,注释非常详细,所以很容易上手。我一边读这本书,一边跟着自己做例子,刚做完一个关于在Struts2中通过重写validate()方法来完成输入校验的例子,如下:
示例将对上面的注册应用进行改进,为上面的Web应用增加Struts2支持。增加Struts2支持后,将通过如下的Action来处理用户请求,下面的Action仅仅重写了ActionSupport类的validate方法。
下面是该RegistAction类的代码:
public class RegistAction extends ActionSupport
{
//该请求包含的四个请求参数
private String name;
private String pass;
private int age;
private Date birth;
//name属性的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return (this.name);
}
//pass属性的setter和getter方法
public void setPass(String pass)
{
this.pass = pass;
}
public String getPass()
{
return (this.pass);
}
//age属性的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return (this.age);
}
//birth属性的setter和getter方法
public void setBirth(Date birth)
{
this.birth = birth;
}
public Date getBirth()
{
return (this.birth);
}
//重写validate方法,进行数据校验
@Override
public void validate()
{
System.out.println("进入validate方法进行校验");
//如果用户名不为空,且不匹配长度为4~25的字母和数字组成的字符串。
if(name != null && !Pattern.matches("\\w{4,25}", name.trim()))
{
addFieldError("user" ,
"您输入用户名必须是字母和数字,且长度必须是4到25之间!");
}
//如果密码不为空,且不匹配长度为4~25的字母和数字组成的字符串。
if (pass != null && !Pattern.matches("\\w{4,25}", pass.trim()))
{
addFieldError("pass" ,
"您输入密码必须是字母和数字,且长度必须是4到25之间!");
}
//如果年龄不在有效的年龄段内
if (age > 150 || age <= 0)
{
addFieldError("age" , "您输入的年龄必须是一个有效的年龄!");
}
//取得有效生日的最后期限
Calendar end = Calendar.getInstance();
end.set(2050 , 2 , 21);
//取得有效生日的最早期限
Calendar start = Calendar.getInstance();
start.set(1900 , 1 , 1);
//如果生日不为空,且生日不是一个有效的生日。
if (birth != null && (birth.after(end.getTime()) || birth.before(start.getTime())))
{
addFieldError("birth" , "您输入的生日必须在一个有效的时间段内");
}
}
}
把上面的Action的validate方法与前面的Servlet中进行数据校验的代码进行比较,不难发现,上面的validate方法略为简化,主要是因为减少了类型转换的代码。因为Struts2内建的类型转换器会自动将请求参数转换成所需的数据类型。
为了将类型转换失败后的提示信息中文化,增加如下的国际化资源文件:
#改变类型转换失败后的提示信息
xwork.default.invalid.fieldvalue={0}字段无效
如果输入参数的类型转换失败,就会返回input逻辑试图。但实际上,即使类型转换失败,系统一样会执行validate方法来进行数据校验。那么,那些不能执行类型转换失败的属性的属性值就是null(如果是数字型属性,则值为0)。
在上面的validate方法中,一旦发现校验失败,就把校验失败提示通过addFieldError方法添加系统的fieldError中,这与类型转换失败后的处理是完全一样的。
为了在input视图对应的JSP页面中输出错误提示,应该在该页面中增加如下代码:
<!-- 输出类型转换失败提示和校验失败提示 -->
<s:fielderror/>
上面的<s:fielderror/>标签专门负责输出系统的fieldError信息,也就是输出系统的类型转换失败提示,以及输入校验失败提示。
如果在输入页面中的生日输入框中输入无效生日格式,将看到如下图所示的页面。
从图中可以看出,即使生日请求参数无效,类型转换失败,但依然可以看到RegistAction中validate方法校验后的结果。
注意:即使类型转换失败,系统并不是直接返回input逻辑视图,依然会调用Action的validate方法来进行输入校验。这一点,与前面介绍的类型转换失败处理后的处理是一致的。
在上面的validate方法中,如果校验失败,我们直接添加了校验失败的提示信息,并没有考虑国际化的问题。但这并不是太大的问题,因为ActionSupport类里包含了一个getText方法,该方法可以取得国际化信息。
分享到:
相关推荐
struts2的输入校验有两种方式: 一.重写validate()方式 二.采用配置文件的方式 先我们就以一个简单的登录的例子来讲解这个吧. 重点讲解下,第二个采用配置文件的方式: 1.添加一个xml的校验文件,保存在...
在Eclipse中配置Struts2...Struts2―表单验证validate(html)对validate的type属性校验类型以及param 做了详细的解释说明。 struts2和struts的比较 让你更清楚的知道struts2和struts的不同之处。 struts教程(html)
重写validate方法校验将会产生两种错误信息:Field级别错误信息,Action级别的错误信息 Field级别错误信息就是将错误信息添加到fieldErrors,也就是将错误信息添加到addFieldError方法中。 Action级别的错误信息...
在struts2里,完成登录页面,使用validate对输入数据进行校验,用户名必填,密码必填且长度大于6。
struts2输入校验总结,struts2自带的校验器,以及校验器不能做的check的处理的总结
主要为大家详细介绍了Java struts2 validate用户登录校验功能实现的具体步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
struts提供了标签来显示整个ActionErrors的错误信息。但要在struts-config.xml中设置<action ...
validate()可以指定校验范围内,或者是全局的 字段。而validateAll()只能校验全局。这篇文章主要介绍了vue+VeeValidate 校验范围(部分校验,全部校验) ,需要的朋友可以参考下
Struts2验证应该包括验证器(需要xml配置)和Action中的validate()验证方法两种。后者很简单,只需要把 验证条件加进去就可以啦!
这个validate验证框架中的actiionerror级别的错误的验证提示,并包含了如何在一个Action中处理多个业务逻辑,(struts1.x 中的DispatcheAction),例子比较简单,希望对大家学习struts有所帮助。
Struts2用validate方法进行表单验证
主要介绍了Struts2中validate数据校验的两种方法及Struts2常用校验器,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
详细介绍了struts2 的 validate方法对输入进行校验
Struts2+jquery.validate框架实现用户名是否存在
Struts2数据校验与国际化,有validate()方法校验,有validateXxx()方法校验,有配置文件校验;国际化:有英,香港,内地
jquery.validate 与 struts2的整合使用
输入校验之validateXXX方法校验的一个例子
主要介绍了Struts中使用validate()输入校验方法,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧
validateXXX方法校验得到的错误信息先显示出来,然后才是validate方法校验的字段错误信息 validate方法在validateXXX方法被调用后,依然会被调用 错误信息均保留在ArrayList中,谁先运行,谁的结果就排在前面 11...
validateXXX方法校验得到的错误信息先显示出来,然后才是validate方法校验的字段错误信息 validate方法在validateXXX方法被调用后,依然会被调用 错误信息均保留在ArrayList中,谁先运行,谁的结果就排在前面 11...