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不會讓這些喜歡而且支持他的用戶失望!!!

相關文章
相關標籤/搜索