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