继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

Coley_5
关注TA
已关注
手记 86
粉丝 8548
获赞 6550
    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();方法,到这里整个框架的初始化完成

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP