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不会让这些喜欢并且支持他的用户失望!!!
话说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不会让这些喜欢并且支持他的用户失望!!!
相关文章推荐
- JFinal源码分析------plugin的故事
- JFinal源码走读_5_Validator校验源码分析
- JFinal源码走读_5_Validator校验源码分析
- JFinal个人学习笔记之源码分析1
- 史上最全的JFinal源码分析(不间断更新)
- jfinal 使用以及源码分析--序言
- JFinal源码 分析之 Core包分析
- JFinal源码解析--ActionMapping,Interceptor
- JFinal源码分析------Model的前世今生
- JFinal源码走读_4_ActiveRecord CURD分析
- JFinal个人学习笔记之源码分析3
- JUnit4执行cases背后的故事(1)---JUnitCore源码分析
- JFinal 源码分析 [DB+ActiveRecord]
- JFinal源码分析三:AOP触发过程
- OKHTTP源码分析-CallServerInterceptor
- Mybatis Interceptor 拦截器原理 源码分析
- JFinal源码走读_4_ActiveRecord CURD分析
- JFinal源码分析------快速开发利器的那些事儿
- GEF源码分析(六) GEF 的EditPart的职能分离 __ 跨国时尚媒体集团广告部门 的故事 二
- JFinal源码分析------初始化那些事儿2之Render