`
andylu521
  • 浏览: 17034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Struts2中通过重写validate()方法来完成输入校验

阅读更多
现在在学习李刚老师的《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方法,该方法可以取得国际化信息。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics