• Jfinal中的validator理解/详解


    为了验证账号密码不为空,需要在控制器下的login()方法前添加验证器:

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

    而validator是实现了Interceptor(拦截器)接口。validator的用法如下:

     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)

    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();
            }
        }

    知道先后顺序后,看方法中的代码分别作了什么:

    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):

    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()存储了起来,实际就是

    存储到了request域中。

    以上验证器中的第一个方法看完。

    第二个方法中的代码:

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

    第一行和if判断actionkey是否来自登录页面,如果是,就将前面存储的信息发送到指定页面

    总结:先判断填入的用户名和密码是否为空,如果为空,将信息存储到request域中,发送回登录页面。

     
    
    
  • 相关阅读:
    利用.Net的CLR和BCL实现函数IsNumeric
    30岁前挣到10万年薪 五位年轻人的高薪秘诀
    三级关链菜单通用版
    对Session和Cookie的区分与理解
    转贴:C#排序算法大全
    无效的 CurrentPageIndex 值.它必须大于等于 0 且小于 PageCount!的问题
    ASP.NET中“检测到有潜在危险的表单值”的解决方法
    如何让网页版面更适合浏览者呢?这里有技巧
    十二星座情侣恋爱积分
    asp.net 三种基本的参数传递方法(web forms)
  • 原文地址:https://www.cnblogs.com/neu-student/p/6539248.html
Copyright © 2020-2023  润新知