Struts2学习(五)—表单验证

上一篇我们学习了struts2中的表单提交数据,我们注意到在我们输入数据时,我们并没有在HTML上编写JavaScript用于输入数据的验证
我们先看下面的一个例子
这里写图片描述
注意看,我们在age文本框中输入了字符 ,我们知道age 是int类型的此时输入了string类型的数据会怎么处理呢?
提交表单,出现了异常:
这里写图片描述
注意看异常信息
上面说返回了input 而我们的reslult没有定义
如果Struts 2返回”input”表明在表单输入无效如何处理? 在大部分情况下我们想重新显示包含表单的web页面并包含用户在表单输入数据和如何错误的信息 .

要处理返回值 “input” 我们需要在struts.xml 中action 下添加如下的结果 .

<result name="input">/register.jsp</result>

上面的result 节点在 success result节点之后,在 register action 结束之前.
添加之后 ,我们可以看到 在有错误的情况下提交表单,struts2会根据我们配置的input中的jsp进行转发
这里写图片描述
由于当验证失败时 Struts 2将返回 input, Struts 2 框架将重新显示register.jsp. 由于我们使用Struts 2表单标签, Struts 2 将自动添加错误消息. 这些错误消息是我们在 addFieldError方法调用中指定. 该 addFieldError方法有两个参数. 第一个参数是错误应用的表单字段 而第二个参数是显示在表单上面的错误消息.

因而如下的addFieldError方法调用:

addFieldError( "personBean.firstName", "First name is required.")

将导致消息”First name is required” 在firstName 表单字段上显示.
validate方法
Struts 2调用 validate方法, 验证失败, register.jsp 将显示错误消息.
美化错误消息
Struts 2 s:head 标签用来提供包含美化错误信息的CSS . 添加 到 register.jsp 在HTML 标签后. 和上面相同的步骤你将看到如下效果:
这里写图片描述
重写validate方法
我们可以在action 类Register中重写validate方法,

@Override
    public void validate() {
        // TODO Auto-generated method stub
        super.validate();
        if (personBean.getFirstName().length() == 0) {
            addFieldError("personBean.firstName", "名字不能为空");
        }
        if (personBean.getLastName().length() == 0) {
            addFieldError("personBean.lastName", "名字不能为空");
        }
        //邮箱可以为空 ,当不为空时验证
        if (personBean.getEmail().length() != 0) {
            if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
                addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
            }
        }
        if (personBean.getAge() < 18) {
            addFieldError("personBean.age", "年龄不能小于18岁");
        }

此时,我们在输错的时候会提示:
这里写图片描述
我们还可以在action类中定义 validateExecute方法

public void validateExecute(){
        if (personBean.getFirstName().length() == 0) {
            addFieldError("personBean.firstName", "名字不能为空");
        }
        if (personBean.getLastName().length() == 0) {
            addFieldError("personBean.lastName", "名字不能为空");
        }
        //邮箱可以为空 ,当不为空时验证
        if (personBean.getEmail().length() != 0) {
            if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
                addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
            }
        }
        if (personBean.getAge() < 18) {
            addFieldError("personBean.age", "年龄不能小于18岁");
        }
        System.out.println("validateExecute 方法----------------------");
    }

在validate方法中添上:

System.out.println("validate 方法 ---------------  ");

我们看到:
这里写图片描述
控制台输出:

validateExecute 方法----------------------
validate 方法 ---------------  

两个方法都起到了验证的作用
还有一个方法也可以起到验证作用:

public void validateDoExecute(){
        if (personBean.getFirstName().length() == 0) {
            addFieldError("personBean.firstName", "名字不能为空");
        }
        if (personBean.getLastName().length() == 0) {
            addFieldError("personBean.lastName", "名字不能为空");
        }
        //邮箱可以为空 ,当不为空时验证
        if (personBean.getEmail().length() != 0) {
            if (!personBean.getEmail().matches("\\w+@\\w+(\\.\\w+)+")) {
                addFieldError("personBean.email", "邮箱不是一个合法邮箱!!");
            }
        }
        if (personBean.getAge() < 18) {
            addFieldError("personBean.age", "年龄不能小于18岁");
        }
        System.out.println("validateDoExecute 方法----------------------");
    }

经验证当三个方法都存在时
控制台打出:

validateExecute 方法----------------------
validate 方法 ---------------  

说明validateDoExecute 方法没调用,当把validateExecute 方法去掉时控制台输出:

validateDoExecute 方法----------------------
validate 方法 ---------------  

调用了两个方法
总结
看了上面的三个方法,在具体使用时,使用哪个比较好呢,个人推荐使用
validate+XXX方法,如validateExecute()方法,因为,在一个action中有可能我们会写多个方法
如在用户管理的action中 我们可能也会写上退出和注册的方法
在UserAction中有两个方法 :login() 和 logout() register(),在登录时需要验证,注册同样需要验证,二两者的验证方式又不一样 那么使用validate方法就不太适合了,而使用validateLogin 和validateRegister分别进行登录和注册验证则非常适合
使用validate()方法还有一个缺点,那就时在进行不需要验证的logout()方法,他也会进行验证
还是上面的例子:我们在register 类中 写一个

public String logout(){
        return SUCCESS;
    }

先把validateExecute()和validateDoExecute()方法注释
并在struts.xml中


        <action name="logout" class="com.lgh.struts2maven.action.Register" method="logout">
        <result name="success">/logout.jsp</result>

        </action>

在thankyou.jsp页面添加退出链接

<a href="<s:url action='logout' />"> 退出</a>

这时,输入数据提交,后的界面是
这里写图片描述
我们点击退出
这里写图片描述
我们看到错误在register类中的34行
这里写图片描述
我们可以很轻易的判断出空指针异常的原因,但是这时我们想的是,lagout根本不需要进行验证,但是它还是执行了验证方法
,这是我们不需要的,
解决的方法
(1)、在不需要进行验证的方法加上annotation,即在方法前加上@SkipValidation

    @SkipValidation
    public String logout(){
        return SUCCESS;
    }

加上了注解,当我们执行action调用该方法时,会忽略验证的
这时重启项目执行logout
这里写图片描述

(2)、不使用validate()方法,使用validateXXX方法,验证针对具体的某个方法,这样,也可以解决该问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值