JFinal 學習筆記之Handler包分析

HandlerFactory.java

  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  怎麼看這個問題,求解。數組

Handler.java

  咱們 先來 看看 代碼 ,這是 一個 抽象類,其中 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數組 ,標識是否 被處理 過,我以爲 熟悉代碼 仍是 要 從 它的實現來分層 發散,因此 下面 的都是 它的實現類。函數

相關文章
相關標籤/搜索