您的位置:首页 > 其它

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

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

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

大家可以看到有三个不同buildXxx方法,这个也就JFinal文档中所说的不同级别的Interceptor。具体的级别类型,大家可以去看JFinal的官方文档,如果没有记错的话(好像是Global,Controller,Action,method这几个级别),好了看完了这几个不同的buildinXxx方法 我们来看看这几个方法里面都做了些什么?

buildMethodInterceptors()

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可是帮我们做了很多的事情,比如说字段必填,校验字段输入是否一致,电子邮箱的校验等等,那么他是如何工作的了?我们且看下面的代码分析:

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

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

void intercept(ActionInvocation ai);

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

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

通过查看这个方法,我们可以看到,Validator是先执行validate,在执行handleError方法的。

其实细心的你应该会发现,这两个方法都是抽象的,需要子类去实现的。所以就出现了为什么在你继承了Validator以后要重载这两个方法的原因了

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

Interceptor大概应该和这个类似吧,今天没有详细去看过这部,主要是想看看如何Validator的工作原理而已,便于更好的与项目组的孩子们沟通交流,Jfinal项目正在努力开发中...希望Jfinal不会让这些喜欢并且支持他的用户失望!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息