场景化表单验证
场景化表单验证
哈库纳 发表于1年前
场景化表单验证
  • 发表于 1年前
  • 阅读 135
  • 收藏 3
  • 点赞 0
  • 评论 0

    上一篇文章介绍了如何使用 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”,密码随意。看到注册失败。

共有 人打赏支持
哈库纳
粉丝 928
博文 81
码字总数 149803
作品 4
×
哈库纳
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: