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

  • 相关阅读:
    Spring AOP + Redis 实现针对用户的接口访问频率限制
    Flutter 圆形透明 Loading 弹窗
    VUE 自定义组件的双向数据绑定 和替代钩子
    10个前端技巧
    前端中的数据库
    cors 跨域问题
    promise解决回调地狱问题
    VUE框架JS组件的封装 --Vue.extend
    HBuilderX 用夜神模拟器运行vue项目
    vue关于axios 拦截器的使用
  • 原文地址:https://www.cnblogs.com/kmsfan/p/7496615.html
Copyright © 2011-2022 走看看