使用验证器
一个请求在递交到后台之后正式处理之前会做一些参数合法性校验。比如:年龄大于1,性别必须是:男或女,帐号密码输入不能为空等。
最后还要把验证的信息反馈到页面上,Hasor 的验证器可以帮助实现这些功能。
以登录场景为例,首先定义请求参数组:
@ValidBy(LoginFormValidation.class)
public class LoginForm {
@RequestParameter("account")
private String account;
@RequestParameter("password")
private String password;
...
}
编写验证器
public class LoginFormValidation implements Validation<LoginForm> {
public void doValidation(String validType,
LoginForm dataForm,
ValidInvoker errors) {
if (StringUtils.isBlank(dataForm.getLogin())) {
errors.addError("login", "帐号不能为空!");
return;
}
if (StringUtils.isBlank(dataForm.getPassword())) {
errors.addError("password", "密码不能为空!");
return;
}
}
}
最后在请求方法中注入 ValidInvoker,然后显式调用 doValid(...) 触发验证。当前 Hasor Web 不提供 @Valid 参数注解,验证入口就是 ValidInvoker。
@MappingTo("/login.htm")
public class Login {
@Any
public void execute(@ParameterGroup LoginForm loginForm,
RenderInvoker invoker,
ValidInvoker valid) {
valid.doValid("login", loginForm);
if (valid.isValid()) {
invoker.renderTo("/userInfo.htm");
} else {
invoker.put("loginForm", loginForm);
invoker.renderTo("/login.htm");
}
}
}
ValidInvoker 会把验证结果放到 validData 中,页面可以按模板引擎自己的语法读取它。例如下面是 Freemarker 模板语法:
<form action="/login.do" method="post">
<!-- 帐号的验证结果 -->
帐号:<input name="account" type="text" value="${loginForm.account}">
<#if validData["account"]?? >
${validData["account"]?join(",")}
</#if>
<!-- 密码的验证结果 -->
密码:<input name="password" type="password" value="${loginForm.password}">
<#if validData["password"]?? >
${validData["password"]?join(",")}
</#if>
<input type="submit" value="递交"/>
</form>