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域中,发送回登录页面。

 
				
时间: 2024-10-14 10:57:02

Jfinal中的validator理解/详解的相关文章

理解泛函的概念(图像处理中的数学原理详解)

全文目录请见 图像处理中的数学原理详解(Part1 总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 2.4  从泛函到变分法 作为数学分析的一个分支,变分法(Calculus of Variations)在物理学.经济学以及信息技术等诸多领域都有着广泛而重要的应用.变分法是研究依赖于某些未知函数的积分型泛函极值的普遍方法.换句话说,求泛函极值的方法就称为是变分法. 2.4.1  理解泛函的概念 变分法是现代泛函分析理论

js 中中括号,大括号使用详解

一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen","AGE":"28"};上面声明了一个名为"LangShen"的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性,所以访问时,应该用.(点)来层层访问:LangShen.Name.LangShen.AGE,当然我们也可以用数组的方式来访问,如:Lang

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法

word2vec 中的数学原理详解

word2vec 中的数学原理详解 word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟. 第一次接触 word2vec 是 2013 年的 10 月份,当时读了复旦大学郑骁庆老师发表的论文

C# 中的委托和事件详解

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

linux-2.6.26内核中ARM中断实现详解(转)

转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJRaD 作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM ATC授权培训讲师. 看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解.先从函数注册引出问题吧. 一.中断注册方法 在linux内核中用于申请中断的函数是req

图像处理中的数学原理详解21——PCA实例与图像编码

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 如果你对PCA的推导和概念还不是很清楚,建议阅读本文的前导文章 http://blog.csdn.net/

图像处理中的数学原理详解9——索伯列夫空间

全文目录请见 图像处理中的数学原理详解(Part1 总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 在泛函分析中,索伯列夫空间并不像 巴拿赫空间或者希尔伯特空间那么引入注意.但是在图像处理中,索伯列夫空间在介绍BV空间(有界变差函数空间)时,会被提到.而BV函数空间对于理解TV算法(偏微分方程在图像处理中的重要内容)至关重要!所以我特别在"图像处理中的数学原理详解"系列文章中留出一个小节来对索伯列夫空间进行必

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择