Hasor 表單驗(yàn)證

2018-10-09 11:40 更新

通常一個表單在遞交到后臺之后我們在處理表單內(nèi)容之前會做一些參數(shù)合法性校驗(yàn)。比如:年齡大于1,性別必須是:男或女,帳號密碼輸入不能為空。最后還要把驗(yàn)證的信息反饋到頁面上。


Hasor 在設(shè)計表單驗(yàn)證功能時候參考了大量具有類似功能的框架,也做了大量 API 上面的設(shè)計優(yōu)化。


我們以登錄場景為例進(jìn)行說明,首先把各種登錄請求參數(shù)傳遞進(jìn)來。下面是處理登錄請求的代碼。

public class LoginForm {
    @ReqParam("account")
    private String account;
    @ReqParam("password")
    private String password;
    ...
}

@MappingTo("/login.htm")
public class Longin {
    public void execute(@Params LoginForm loginForm, 
                        RenderInvoker invoker) {
        ...
    }
}


第一步:編寫表單驗(yàn)證器

public class LoginFormValidation implements Validation<LoginForm> {
    @Override
    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;
        }
    }
}


第二步:建立表單對象 LoginForm 和驗(yàn)證器 LoginFormValidation 之間的關(guān)系

@ValidBy(LoginFormValidation.class)
public class LoginForm {
    ...
}


第三步:通過 @Valid 注解告訴 Controller 這個參數(shù)需要進(jìn)行表單驗(yàn)證。

@MappingTo("/login.do")
public class Longin {
    public void execute(@Valid() @Params LoginForm loginForm) {
        System.out.println("login data is " + JSON.toString(loginForm));
    }
}


接下來我們接著改造 Login,讓它實(shí)現(xiàn)如果表單驗(yàn)證成功我們就跳轉(zhuǎn)到用戶詳情頁。如果驗(yàn)證失敗就回到登陸頁并提示錯誤。

@MappingTo("/login.htm")
public class Longin {
    public void execute(@Valid() @Params LoginForm loginForm,
                        RenderInvoker invoker,
                        ValidInvoker valid) {
        if (valid.isValid()) {
            invoker.renderTo("/userInfo.htm");
        } else {
            invoker.put("loginForm", loginForm);
            invoker.renderTo("/login.htm");
        }
    }
}


剩下的就是login頁面處理驗(yàn)證信息回顯(freemarker 模板語法)

<form action="/login.do" method="post">
    <!-- 帳號的驗(yàn)證結(jié)果 -->
    帳號:<input name="account" type="text" value="${loginForm.account}">
    <#if validData["account"]?? >
        ${validData["account"]?join(",")}
    </#if>

    <!-- 密碼的驗(yàn)證結(jié)果 -->
    密碼:<input name="password" type="password" value="${loginForm.password}">
    <#if validData["password"]?? >
        ${validData["password"]?join(",")}
    </#if>
    <input type="submit" value="遞交"/>
</form>


有些校驗(yàn)邏輯比較通用,我們可以提取成公共的校驗(yàn)邏輯。這樣一個表單的校驗(yàn)就可以是 公共 + 制定兩部分組成。表單驗(yàn)證器可以同配置多個,如下:

@ValidBy({LoginFormValidation.class, DataBaseValidation.class})
public class LoginForm {
    ...
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號