JFinal 学习笔记之Handler包分析

HandlerFactory.java

  HandlerFactory是不可实例化的,因为 它的构造 函数 特意定位 私有 的;它有一个 静态的方法叫做 getHandler,它有两个参数 ,一个是Handler的List类型,另一个是一个单一的handler,代码如下 :

	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方法。

    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 被 标记为过时的,也就是说 已经 没多少地方用到 了。

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数组 ,标识是否 被处理 过,我觉得 熟悉代码 还是 要 从 它的实现来分层 发散,所以 下面 的都是 它的实现类。

posted @ 2017-09-08 22:06  yangliwen  阅读(1532)  评论(0编辑  收藏  举报
document.getElementById("homeTopTitle").innerText="ღKawaii";