Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266849
  • 博文数量: 99
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1270
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-20 13:27
文章分类

全部博文(99)

文章存档

2011年(1)

2010年(21)

2009年(77)

我的朋友

分类: Java

2009-03-26 10:07:18

现在在学习李刚老师的《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页面中输出错误提示,应该在该页面中增加如下代码: 
 
 
上面的标签专门负责输出系统的fieldError信息,也就是输出系统的类型转换失败提示,以及输入校验失败提示。 

如果在输入页面中的生日输入框中输入无效生日格式,将看到如下图所示的页面。 
从图中可以看出,即使生日请求参数无效,类型转换失败,但依然可以看到RegistAction中validate方法校验后的结果。 
注意:即使类型转换失败,系统并不是直接返回input逻辑视图,依然会调用Action的validate方法来进行输入校验。这一点,与前面介绍的类型转换失败处理后的处理是一致的。 
在上面的validate方法中,如果校验失败,我们直接添加了校验失败的提示信息,并没有考虑国际化的问题。但这并不是太大的问题,因为ActionSupport类里包含了一个getText方法,该方法可以取得国际化信息。

阅读(5820) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-07-05 16:11:09

抄袭