JFinal源码分析------Before注解符和Interceptor,Validator的故事

早上作开发,被Before注解符的妙用僧僧的吸引住了,下午吃源码的时候,倒是有不能找到Before注解符在源码的使用地(PS:不是定义的那个Before,而是Before如何在代码使用的地方),后来没有办法,开启DEBUG模式,慢慢的摸索,诶!!!5分钟有之后,有发现,没错,是真有发现!!!且听我细细道来: 话说Before的用处,还得要从JfinalFilter的出事化开始,在ActionMapping.buildActionMapping()里面,有以下代码: <!-- lang: java --> Interceptor[] controllerInters = interceptorBuilder.buildControllerInterceptors(controllerClass);java

Interceptor[] methodInters = interceptorBuilder.buildMethodInterceptors(method); Interceptor[] actionInters = interceptorBuilder.buildActionInterceptors(defaultInters, controllerInters, controllerClass, methodInters, method);app

你们能够看到有三个不一样buildXxx方法,这个也就JFinal文档中所说的不一样级别的Interceptor。具体的级别类型,你们能够去看JFinal的官方文档,若是没有记错的话(好像是Global,Controller,Action,method这几个级别),好了看完了这几个不一样的buildinXxx方法 咱们来看看这几个方法里面都作了些什么?框架

buildMethodInterceptors()ui

Interceptor[] buildControllerInterceptors(Class<? extends Controller> controllerClass) { Before before = controllerClass.getAnnotation(Before.class); return before != null ? createInterceptors(before) : NULL_INTERCEPTOR_ARRAY; } 你们能够看到,在这个方法里面的第一句,就是去取Before这个注解,而后判断是否有值来给before赋值对象

buildMethodInterceptors继承

Interceptor[] buildMethodInterceptors(Method method) { Before before = method.getAnnotation(Before.class); return before != null ? createInterceptors(before) : NULL_INTERCEPTOR_ARRAY; }接口

这个方法也是相似的过程开发

经过对这两个方法的剖析,你们该知道before这个注解符在实际的应用中是如何使用的了吧!文档

好了看完这个之后,咱们来看看Validator,这个validator但是帮咱们作了不少的事情,好比说字段必填,校验字段输入是否一致,电子邮箱的校验等等,那么他是如何工做的了?咱们且看下面的代码分析:get

public abstract class Validator implements Interceptor { .... }

经过这个定义 咱们能够看到,其实Validator实现的是Interceptor的接口,也就是说,咱们能够把他理解成为一个特殊的Interceptor(我不知道这么理解对不对,有好的理解,恳请留言告知),在Interceptor的接口中定义了以下的方法:

void intercept(ActionInvocation ai);

也就是说,咱们的Validator是重写了intercept()这个方法,具体的实现过程,能够参考源码,在这里我只说说这里面大概的执行过程: 一、获取Validator的对象实例,controller和invocation,获取这些值的目的就在于这句代码 validator.validate(validator.controller); 大概意思就是说,哪一个validator校验哪个controller 二、检查校验的结果是否有错误,若是有,就处理错误,代码以下:

if (validator.invalid) validator.handleError(validator.controller); else invocation.invoke();

经过查看这个方法,咱们能够看到,Validator是先执行validate,在执行handleError方法的。

其实细心的你应该会发现,这两个方法都是抽象的,须要子类去实现的。因此就出现了为何在你继承了Validator之后要重载这两个方法的缘由了

好像从这里的也能明白框架的意义,就是,全部的关于业务相关的细节问题,框架都不会进行参与,了框架只是把那些重复的,没有技术含量的东西帮你作掉,让你更加专一于你自己业务逻辑的开发。

Interceptor大概应该和这个相似吧,今天没有详细去看过这部,主要是想看看如何Validator的工做原理而已,便于更好的与项目组的孩子们沟通交流,Jfinal项目正在努力开发中...但愿Jfinal不会让这些喜欢而且支持他的用户失望!!!

相关文章
相关标签/搜索