您的位置:首页 > 编程语言 > Java开发

struts2学习笔记(5)——输入校验

2009-10-25 15:04 225 查看
再回到上次的例子

在上次最后的页面中存在x,y,age,date,和username几个输入框,当输入正确数据时没有问题,但是,假如在age中输入英文字母,然后就会跳到一个错误页面,一大堆英文,用户看见了是非常不好的。

我们要对用户输入的数据进行验证,不仅可以友好地提示用户出错信息,同样也可以提高系统的安全性。要实现数据验证,必须在自定义的Action类中,override父类的validate方法。

现在我们做一个新的示例。

首先设计如图所示的register.jsp页面,表单action属性为register.action,注意后面一定要加.action



在此规定username在5-10个字符间,password在5-10个字符间,且repassword和password一样。age在0-100间,birthday在graduation前。

然后在RegisterAction中override父类的validate方法

@Override
public void validate() {

System.out.println("validating");

if (null == username || username.length() < 5 || username.length() > 10) {
this.addFieldError("username", "username invalid");
}
if (null == password || password.length() < 5 || password.length() > 10) {
this.addFieldError("password", "password invalid");
} else if (null == repassword || !password.equals(repassword)) {
this.addFieldError("password", "two passwords are not the same");
}
if (age < 0 || age > 100) {
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",
"gradution should after birthday");
}
}

}

应该注意的是,首先必须判断Action中各字段值是否为null,这是因为,用户可能直接通过url访问action,即在地址栏中输入http://t-shine:8080/struts2/register.action来访问,这样,action中各字段便是null。

在validate方法中加了一个输入,在Tomcat控制台中可以看到输出。

可以尝试一下,当输入错误信息时的页面显示效果。







但是,这个仍然有一个问题,就是当输入如下数据时,看到页面显示就会出现不同寻常的地方了。





为什么会产生这种情况呢?

首先看看类型转换与输入校验的流程:

1. 首先Struts2对客户端传来的数据进行类型转换

2. 类型转换完毕后再进行输入校验

3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)

注意:如果类型转换不成功,也同样要进行输入校验,此时会给这些字段一个默认值。

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

而这错误是struts自动生成的,对用户来说并不友好 ,特别是在中文环境下。

如何修改struts自动生成的错误信息呢?

在struts.xml中的子元素中加一个constant元素(设置常量),<constant name="struts.custom.i18n.resources" value="message"></constant>

在项目中新建一个文件message.properties,和struts.xml同目录,这样就设置了一个全局的属性文件。
内容为:

xwork.default.invalid.fieldvalue={0} error

前面是固定的
{0} 代表当前属性名,若在输入中age输入错误,即会显示"age error"

当输入如下信息时,显示结果如图所示





前面介绍了,那是全局属性文件,那么还有局部的。

局部的属性文件名为XXXAction.properties,XXX代表自定义的Action类名。

可以输入如下内容:

invalid.fieldvalue.age=age conversion error

那么输入如下信息时,显示结果如图所示







现在我想把提示信息换成中文的怎么办呢?

这里就要注意了,properties文件中不能直接写入中文,我们要把中文改成用Unicode表示。

可以用JDK里面提供的一个工具来完成转换,native2ascii

使用方法如下

可以在命令提示符中,输入native2ascii,然后输入文字进行转换,也可以直接转换文件

native2ascii message.properties message2.properties

然后复制内容到MyEclipse中即可。

结果如下显示。





这样就完成了一个简单的输入校验。

下次将深入研究输入验证。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: