JFinal框架源碼分析(一)——JFinal項目的啓動

疑問:

一、如何開啓一個框架的源碼分析?javascript

二、如何實現支持 web 項目無需 web.xml 配置文件,便於嵌入式整合 jetty、undertowjava

三、責任鏈模式? Handle的初始化過程?程序員

四、Route是如何被加載的?web

項目入口

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

啓動過程:WebRoot-->Web-INF-->web.xml
app

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())ui

而後再去看看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的一個類 這裏獲得具體的配置this

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。url

在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進行初始化

相關文章
相關標籤/搜索