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

相关文章
相关标签/搜索