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

本文介绍Struts2框架中的输入验证方法,包括如何自定义验证规则、处理类型转换错误及自定义错误提示信息。

再回到上次的例子

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

结果如下显示。 


图片六 

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

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值