文档章节

场景化表单验证

哈库纳
 哈库纳
发布于 2016/10/01 16:47
字数 806
阅读 143
收藏 3

    上一篇文章介绍了如何使用 Hasor 表单验证功能(https://my.oschina.net/u/1166271/blog/754087)那么这一篇文章特意讲一下场景化表单验证。

什么是场景化验证?

    场景化验证主要是指针对同一个表单对象,在不同场景下的不同表单验证逻辑。在上一篇文章中我们设计的场景是登录。那么在这一篇文章中,我们在考虑一下用户注册。

    用户登录、用户注册。两组表单的数据基本是一致的,可以直接拿来复用。数据模型上注册场景下密码的输入可能会有两个。

    验证逻辑上,登录场景下需要时候验证需要验证帐号密码是否正确。而帐号注册场景下需要检测是不是出现了重复帐号。

    如果没有场景化表单验证,那么我们需要建立两套几乎一摸一样 FormBean 分别对应登录表单和注册表单。虽然可以通过抽象共通的基类来减少重复开发,但是两个 FormBean 的子类的产生无疑也是一种浪费。

    场景化表单验证就是为了解决这个问题而诞生的,它在解决这个问题时,甚至还帮助你少写了更多的代码。简化了更多的开发工作。

使用场景化表单验证

    第一步,设计一个两个场景下通用的 FormBean,顺便我们建立表单和验证器之间的关系。

@ValidBy(LoginFormValidation4Scene.class)
public class LoginForm4Scene {
    @ReqParam("email")
    private String email;
    @ReqParam("account")
    private String account;
    @ReqParam("password")
    private String password;
    ...
}

    第二步,然后编写我们的表单验证器,下面是完整的例子代码:

public class LoginFormValidation4Scene implements Validation<LoginForm4Scene> {
    @Inject
    private UserDao userDao;
    //
    // - 登录验证
    private void doValidLogin(LoginForm4Scene dataForm, ValidErrors errors) {
        String account = dataForm.getAccount();
        String password = dataForm.getPassword();
        UserInfo userInfo = userDao.queryUserInfoByAccount(account);
        if (userInfo == null) {
            errors.addError("login", "登陆失败,不存在的帐号。");
            return;
        }
        if (!StringUtils.equalsIgnoreCase(password, "pwd")) {
            errors.addError("login", "登陆失败,密码错误。");
            return;
        }
    }
    // - 注册登录
    private void doValidSignUp(LoginForm4Scene dataForm, ValidErrors errors) {
        UserInfo userInfo = this.userDao.queryUserInfoByAccount(dataForm.getAccount());
        if (userInfo != null) {
            errors.addError("signup", "帐号已经被使用,请换一个注册。");
        }
    }
    //
    public void doValidation(String validType, LoginForm4Scene dataForm, ValidErrors errors) {
        // -通用验证逻辑
        if (StringUtils.isBlank(dataForm.getAccount())) {
            errors.addError("account", "帐号为空。");
        }
        if (StringUtils.isBlank(dataForm.getPassword())) {
            errors.addError("password", "密码为空。");
        }
        if (!errors.isValid()) {
            return;
        }
        // -场景化差异
        if (StringUtils.equalsIgnoreCase("signup", validType)) {
            this.doValidSignUp(dataForm, errors);   // 注册
            return;
        }
        if (StringUtils.equalsIgnoreCase("login", validType)) {
            this.doValidLogin(dataForm, errors);    // 登录
            return;
        }
    }
}

    在上面的场景化表单验证例子中我们使用了“validType”参数进行判断场景。validType参数的值是由 @Valid注解提供的。下面我们改一下 Controller 为 Valid 注解增加参数,如下面例子:

@MappingTo("/scene/login.do")
public class Login4Scene {
    public void execute(@Valid("login") @Params LoginForm4Scene loginForm, RenderData data) {
        ...
    }
}

    怎么样?表单的场景化验证是不是很酷炫。

    最后我们看一下整个执行效果。

    1.初始化页面

    2.在什么也不填的情况下点击登录会提示帐号密码为空。

    3.输入错误的帐号,提示帐号不存在。

    4.输入正确的帐号和密码“帐号:zyc,密码:pwd”登录成功,显示 “Hello You!”

    5.在注册场景下帐号填写“zyc”,密码随意。看到注册失败。

© 著作权归作者所有

共有 人打赏支持
哈库纳

哈库纳

粉丝 964
博文 84
码字总数 151810
作品 4
杭州
后端工程师
私信 提问
Hasor-2.4.3 发布,使用表单验证

Hasor 2.4.3 正式发布了,Hasor 是一款基于 Java 语言的应用程序开发框架,它的核心设计目标是提供一个简单、且必要的环境给开发者。开发者可以在此基础上,通过 Hasor 强有力的粘合机制,构...

哈库纳
2016/08/19
1K
2
ASP.NET MVC 2 模型验证

【原文地址】ASP.NET MVC 2: Model Validation 【原文发表日期】 Friday, January 15, 2010 4:14 AM 【除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我...

酱哥哥
2012/05/24
0
0
nice Validator 0.7.0 发布,jQuery 智能表单验证

简单、智能、令人愉悦的表单验证方案。内置强大的验证机制,适用于各种简单和复杂的应用场景。 支持自动初始化,完全不用写js也可以验证表单。 支持主题机制,多规则绑定,事件驱动,国际化。...

JonyZhang
2014/01/20
2.9K
16
简单方便的表单验证

本节将会介绍如何使用 Hasor 强大的表单验证功能。在开始正文之前先墨迹两句为什么要使用表单验证功能。 通常一个表单在递交到后台之后我们在处理表单内容之前会做一些参数合法性校验。比如:...

哈库纳
2016/10/01
400
0
ThinkPHP 表单令牌验证功能

令牌验证 ThinkPHP新版内置了表单令牌验证功能,可以有效防止表单的远程提交等安全防护。 表单令牌验证相关的配置参数有: 'TOKENON'=>true, // 是否开启令牌验证 'TOKENNAME'=>'hash', // ...

zyt_1978
2016/03/27
61
0

没有更多内容

加载失败,请刷新页面

加载更多

十月开源项目推荐:专为 Python 初学者准备的 IDE 你用过吗?

每月新增开源项目。顾名思义,每月更新一期。我们会从社区上个月新收录的开源项目中,挑选出有价值的、有用的、优秀的、或者好玩的开源项目来和大家分享。数量不多,但我们力求推荐的都是精品...

编辑部的故事
11分钟前
5
0
Java/Android 获取文件夹的文件列表(file.listFiles())并按名称排序,中文优先

排序规则 因为是中国人,习惯性看中文文件夹放前面比较顺眼,所以在别人博客(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基础上,加上了自己的排序规则。 默认排序规则...

她叫我小渝
12分钟前
0
0
RabbitMQ通过shovel插件迁移数据

前言 生产环境中会遇到RabbitMQ数据迁移的场景,例如:切换云服务厂商、不同Region之间数据迁移、新搭建RabbitMQ实例,数据需要同步至新的RabbitMQ实例。 前提条件: 源RabbitMQ实例打开了s...

中间件小哥
15分钟前
0
0
kubernetes 环境搭建

kubernetes 简介:Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful)。 点击此处查看官网详情。...

MrPei
29分钟前
1
0
关于scala macro的example

http://www.bbartosz.com/blog/2016/09/24/fun-with-scalameta-examples-part1/

Littlebox
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部