Jfinal中的validator理解/詳解

爲了驗證帳號密碼不爲空,須要在控制器下的login()方法前添加驗證器:jsp

1 @Before(LoginValidator.class)
2     public void login() {

而validator是實現了Interceptor(攔截器)接口。validator的用法以下:ide

 1 public class LoginValidator extends Validator {
 2     @Override
 3     protected void validate(Controller controller) {
 4         
 5         //驗證輸入的帳號和密碼是不是空的
 6         validateRequiredString("account", "account", "請輸入帳號");
 7         validateRequiredString("password", "password", "請輸入密碼");
 8     }
 9     @Override
10     protected void handleError(Controller controller) {
11         String actionKey = getActionKey();
12         if (actionKey.equals("/user/login")) {
13             controller.renderJsp("/view/user/login.jsp");
14         }
15     }
16 }

在上面的代碼中,能夠查看下面的源碼能夠看到,是先執行validate(validator.controller),而後執行handleError(validator.controller)ui

final public void intercept(Invocation invocation) {
        Validator validator = null;
        try {
            validator = getClass().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        
        validator.controller = invocation.getController();
        validator.invocation = invocation;
        
        try {
            validator.validate(validator.controller);
        } catch (ValidateException e) {
            // should not be throw, short circuit validate need this
            LogKit.logNothing(e);
        }
        
        if (validator.invalid) {
            validator.handleError(validator.controller);
        } else {
            invocation.invoke();
        }
    }

知道前後順序後,看方法中的代碼分別做了什麼:this

validateRequiredString("account", "account", "請輸入帳號"):
1 protected void validateRequiredString(String field, String errorKey, String errorMessage) {
2         if (StrKit.isBlank(controller.getPara(field)))
3             addError(errorKey, errorMessage);
4     }

其中的isBlank(controller.getPara(field))只是判斷獲得的參數是否爲空,而addError(errorKey, errorMessage):spa

1 protected void addError(String errorKey, String errorMessage) {
2         invalid = true;
3         controller.setAttr(errorKey, errorMessage);
4         if (shortCircuit) {
5             throw new ValidateException();
6         }
7     }

能夠看到,他把validateRequiredString(String field, String errorKey, String errorMessage)中的錯誤key,和錯誤信息經過controller.setAttr()存儲了起來,實際就是code

存儲到了request域中。blog

以上驗證器中的第一個方法看完。

第二個方法中的代碼:接口

protected void handleError(Controller controller) {
        String actionKey = getActionKey();
        if (actionKey.equals("/user/login")) {
            controller.renderJsp("/view/user/login.jsp");
        }
    }

第一行和if判斷actionkey是否來自登陸頁面,若是是,就將前面存儲的信息發送到指定頁面ci

總結:先判斷填入的用戶名和密碼是否爲空,若是爲空,將信息存儲到request域中,發送回登陸頁面。

相關文章
相關標籤/搜索