HandlerFactory是不可實例化的,由於 它的構造 函數 特地定位 私有 的;它有一個 靜態的方法叫作 getHandler,它有兩個參數 ,一個是Handler的List類型,另外一個是一個單一的handler,代碼以下 :java
public static Handler getHandler(List<Handler> handlerList, 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; }
如上代碼所示 ,從 最後一個 開始 循環 ,而後 把它的next都 賦值 爲 第二個參數 的Handler,而後最後 返回 的Handler爲第一個參數List中 第一個元素,並 帶上了next參數 。使用它的地方就是JFinal的initHandler方法。web
private void initHandler() { Handler actionHandler = new ActionHandler(actionMapping, constants); handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler); }
不過 我有一點疑問,這個 getHandlerList()方法,能帶給 我真正的List嗎 ?由於我看 沒有 地方 去add它,也就是說,這 個List永遠只是 一個 size爲 0的List,不知道@JFinal 怎麼看這個問題,求解。數組
咱們 先來 看看 代碼 ,這是 一個 抽象類,其中 nextHandler 被 標記爲過期的,也就是說 已經 沒多少地方用到 了。app
public abstract class Handler { /** * The next handler */ protected Handler next; /** * Use next instead of nextHandler */ @Deprecated protected Handler nextHandler; /** * Handle target * @param target url target of this web http request * @param request HttpServletRequest of this http request * @param response HttpServletRequest of this http request * @param isHandled JFinalFilter will invoke doFilter() method if isHandled[0] == false, * it is usually to tell Filter should handle the static resource. */ public abstract void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled); }
關鍵 是看 上面的handle方法,這是一個 抽象方法。這裏面 包含了ServletRequest和Response,以及 一個 boolean數組 ,標識是否 被處理 過,我以爲 熟悉代碼 仍是 要 從 它的實現來分層 發散,因此 下面 的都是 它的實現類。函數