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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM