源碼有毒:Jfinal源碼解析(四)

源碼有毒:Jfinal源碼解析(一)

源碼有毒:Jfinal源碼解析(二)
源碼有毒:Jfinal源碼解析(三)

    private void initActionMapping() {
        actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors());
        actionMapping.buildActionMapping();
        Config.getRoutes().clear();
    }

在buildActionMapping()方法之後,把routes信息和攔截器裝載到了actionMapping當中,並且把Config中的Routes信息制空,便於垃圾回收器回收。
回到JFinal的init方法

    boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
        this.servletContext = servletContext;
        this.contextPath = servletContext.getContextPath();

        initPathUtil();

        Config.configJFinal(jfinalConfig);  // start plugin and init log factory in this method
        constants = Config.getConstants();

        initActionMapping();
        initHandler();
        initRender();
        initOreillyCos();
        initTokenManager();

        return true;
    }

簡單看下initHandler()

    private void initHandler() {
        Handler actionHandler = new ActionHandler(actionMapping, constants);
        handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);
    }

看下getHandler方法

    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;
    }

這裏獲取到了Constants中的HandlerList,和新創建的ActionHandler構建成了一個Handler鏈,並且返回鏈頂的Handler
initRender();中初始化了JFinal中的render視圖信息
initOreillyCos();中則初始化了文件上傳插件
回到JFinalFilter的init方法

public void init(FilterConfig filterConfig) throws ServletException {
        createJFinalConfig(filterConfig.getInitParameter("configClass"));

        if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)
            throw new RuntimeException("JFinal init error!");

        handler = jfinal.getHandler();
        constants = Config.getConstants();
        encoding = constants.getEncoding();
        jfinalConfig.afterJFinalStart();

        String contextPath = filterConfig.getServletContext().getContextPath();
        contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
    }

init中接下來的代碼就比較輕鬆了,爲成員變量handler、constants、encoding、contextPathLength賦值,順便調用了jfinalConfig.afterJFinalStart();方法,到這裏整個框架的初始化完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章