jfinal.2.2源碼閱讀(一)jfinal 核心攔截器 ActionHandler
上一篇說道了jfinal核心攔截器JFinalFilter攔截到請求后會調(diào)用處理器來處理請求。jfinal.2.2源碼閱讀(一)jfinal 核心攔截器 JFinalFilter
handler.handle(target, request, response, isHandled);
那么這個handler就是我們今天要講的主題ActionHandler。
1、它是什么時候被初始化的?初始化的是那個實現(xiàn)類?
上一張中我們說到了 JFinalFilter.init 初始化的時候 調(diào)用了 JFinal.init() 函數(shù)進行初始化
在JFinal.init() 函數(shù)中又調(diào)用了 JFinal.initHandler() 函數(shù)
private void initHandler() {//第一步先創(chuàng)建了一個ActionHandler并且傳入actionMapping(路由映射),和constants(常量配置)Handler actionHandler = new ActionHandler(actionMapping, constants);// 經(jīng)過 HandlerFactory.getHandler 處理并且返回一個 handler 對象并且賦值給當前 JFinal類的 成員變量handler// Config.getHandlers().getHandlerList() 返回的是在 JFinal.init 函數(shù)中調(diào)用的// Config.configJFinal(jfinalConfig); 返回的是用戶在 JFinalCongig 中配置的處理器列表。handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);}
在來看看 HandlerFactory.getHandler 函數(shù)都做了什么?
public static Handler getHandler(ListhandlerList, Handler actionHandler) {
Handler result = actionHandler;
for (int i=handlerList.size()-1; i>=0; i--) {
Handler temp = handlerList.get(i);
temp.next = result;
temp.nextHandler = result;
result = temp;
}
return result;
}
上面的代碼其實很簡單,其實就是使用 Handler中的 next 屬性把用戶配置的處理器倒敘一個一個的串聯(lián)起來。并且在最后加上actionHandler處理器。然后返回用戶配置的第一個處理器。(所以用戶自己實現(xiàn)的處理器最后都得調(diào)用next.handle函數(shù)否則執(zhí)行不到 ActionHandler 處理器,也就沒法分配指定的控制器Controller執(zhí)行業(yè)務邏輯)總之最后會一直執(zhí)行到ActionHandler.handle函數(shù)