原始碼有毒 Jfinal原始碼解析(三)

2021-07-16 05:24:24 字數 3515 閱讀 2839

原始碼有毒:jfinal原始碼解析(一)

[原始碼有毒:jfinal原始碼解析(二)

jfinalconfig.configinterceptor(interceptors);

@override

public

void

configinterceptor(interceptors me)

新增全域性***,最終會把這裡新增的***儲存到interceptormanager類的singletonmap中

private void addglobalinterceptor(boolean foraction, interceptor... inters) 

...略

}

jfinalconfig.confighandler(handlers);

這裡比較簡單,直接把handler儲存到了handlers類的集合中

final

public

class

handlers

public listgethandlerlist()

}

到這裡,就把我們自己寫mianconfig中有所有配置資訊,初始化到config中。

回到jfinal類的init()方法

boolean init(jfinalconfig jfinalconfig, servletcontext servletcontext)
private

void

config.getroutes().clear();

}

setexcludedmethodname =buildexcludedmethodname();

interceptormanager interman = interceptormanager.me();

for (entryclass

<? extends

controller>> entry : routes.getentryset())

else

if (methodname.equals("index")) else

action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath(controllerkey));

throw

new runtimeexception(buildmsg(actionkey, controllerclass, method));

}} if (action != null)

}方法一開始先是呼叫了buildexcludedmethodname()方法返回乙個set集合

private

set buildexcludedmethodname()

return excludedmethodname;

}

其實就是將controller類中不帶引數的方法名獲取處理儲存到set集合中,便於區分使用者自己在controller中編寫的action方法。緊接著獲取了interceptormanager***manager的例項。然後對從config中傳遞進來的routes中的map集合進行了遍歷,依次取出controller的class,然後通過呼叫interceptormanager.createcontrollerinterceptor()方法,取出註解在controller類的***資訊,並儲存到interceptormanager中

interceptor controllerinters = interman.createcontrollerinterceptor(controllerclass);

public interceptor createcontrollerinterceptor(class

<? extends

controller> controllerclass)

接著看

boolean sonofcontroller = (controllerclass.getsuperclass() == controller.class);

method methods = (sonofcontroller ? controllerclass.getdeclaredmethods() : controllerclass.getmethods());

這裡獲取到了controller中的所有action方法,通過判斷是否是controller的子類,來解決我們自己編寫的controller的繼承問題

// 遍歷methods

for (method method : methods)

else

if (methodname.equals("index"))

else

// 最終生成乙個action例項

// controllerkey: 請求controller根路徑

// actionkey:請求method的路徑

// controllerclass:controller的class

// actioninters:***

action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath(controllerkey));

throw

new runtimeexception(buildmsg(actionkey, controllerclass, method));

}

看個具體的例項

public

final

class

extends

routes

}public

class

useraction

extends

controller

}

這裡如果要訪問useraction的login方法,路徑則為localhost:port/user/login

action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath

(controllerkey));

throw new runtimeexception(buildmsg(actionkey, controllerclass, method));

在建立好action之後,把action儲存到了乙個map集合之中,如果集合中已經存在這個action,則丟擲異常

JFinal 原始碼知識點

1 jfinal中自帶json工具類,沒必要匯入其他的轉化包。使用 setattr status success renderjson 會將所有setattr 的,轉化成json格式。2 kit包中定義了一些工具類的擴充套件 例如 1 轉化json的工具 jsonkit.tojson str 2 加...

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...