在上次最后的页面中存在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中即可。
结果如下显示。
这样就完成了一个简单的输入校验。
下次将深入研究输入验证。