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

来源:互联网 发布:体彩排列5历史开奖数据 编辑:程序博客网 时间:2024/05/21 08:35

再回到上次的例子

在上次最后的页面中存在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中即可。

结果如下显示。 


图片六 

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

下次将深入研究输入验证。

原创粉丝点击