zoukankan      html  css  js  c++  java
  • JFinal框架源码分析(一)——JFinal项目的启动

    疑问:

    1、如何开启一个框架的源码分析?

    2、如何实现支持 web 项目无需 web.xml 配置文件,便于嵌入式整合 jetty、undertow

    3、责任链模式? Handle的初始化过程?

    4、Route是如何被加载的?

    项目入口

    public static void main(String[] args) {
    	JFinal.start("WebRoot",8787,"/");
    }
    

    启动过程:WebRoot-->Web-INF-->web.xml

    Jfinal初始化

    定位到web.xml中的JFinalFilter,在JFinalFilter里面的init()初始化以下参数:

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

    在web.xml得到具体的配置文件

    temp = Class.forName(configClass).newInstance();
    jfinalConfig = (JFinalConfig)temp;

    真正的初始化过程

    jfinal.init(jfinalConfig, filterConfig.getServletContext())

    然后再去看看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;
    }
    
    private void initTokenManager() {
        ITokenCache tokenCache = constants.getTokenCache();
        if (tokenCache != null)
            TokenManager.init(tokenCache);
    }
    

    由于Handler是责任链模式,这是只是得到链的第一个元素

    private void initHandler() {
        Handler actionHandler = new ActionHandler(actionMapping, constants);
        // 
        handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);
    }
    
    private void initOreillyCos() {
        OreillyCos.init(constants.getBaseUploadPath(), constants.getMaxPostSize(), constants.getEncoding());
    }
    
    private void initPathUtil() {
        String path = servletContext.getRealPath("/");
        PathKit.setWebRootPath(path);
    }
    
    private void initRender() {
        RenderFactory.me().init(constants, servletContext);
    }
    

    运用反射设置好了Route,即把URI和Controller进行了匹配

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

    在Config.configJFinal(jfinalConfig)里面可以看到:

    Config order: constant, route, plugin, interceptor, handler
    JFinalConfig其实是我们自己实现JFinalConfig的一个类 这里得到具体的配置

    static void configJFinal(JFinalConfig jfinalConfig) {
            jfinalConfig.configConstant(constants);             initLogFactory();
            jfinalConfig.configRoute(routes);
            jfinalConfig.configPlugin(plugins);                 startPlugins(); // very important!!!
            jfinalConfig.configInterceptor(interceptors);
            jfinalConfig.configHandler(handlers);
    }
    

    Handler

    Handler可以分为程序员定义的和Jfinal自带的ActionHandle,而这里自定义的Handler只需要实现Handler接口,然后再注册到JFinalHandler里面就可以了。 下面主要是讨论ActionHandler。

    在JFinal.initHandler()这个方法

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

    可以看到在这里注册了一个ActionHandler,ActionHandler用于处理客户端向URI请求。

    // 得到请求的Action
    
    Action action = actionMapping.getAction(target, urlPara);
    
    // 初始化Controller
    
    Controller controller = action.getControllerClass().newInstance();
                controller.init(request, response, urlPara[0]);
    
    // 在这里调用请求的URI对应的方法
    
    new Invocation(action, controller).invoke();
    

    // 这里重新定位到其他的URI对于的方法里面去
    handle(actionUrl, request, response, isHandled);

    总结一下以上过程:初始化的大致流程为:

    -通过项目入口启动框架
    -Filter拦截用户所有的URI请求
    **- 获得JFinalConfig的属性 **
    -依次对Handler,Route,Render进行初始化

  • 相关阅读:
    【转】软件测试流程详解
    【转】web网站常用功能测试点总结
    【转】【Selenium】 selenium 使用教程详解-java版本
    【转】TestNG使用详解
    【转】数据驱动和关键字驱动简单例子
    【转】【Selenium】Selenium 八种元素定位方法
    【Appium】解决No Chromedriver found that can automate Chrome '70.0.3538'
    【Appium】查看andriod内置浏览器webview版本
    【转】Appium自动化测试遇到的chromedriver/chrome坑
    🍖Flask四剑客及简单使用
  • 原文地址:https://www.cnblogs.com/Erma/p/10293147.html
Copyright © 2011-2022 走看看