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