一、如何開啓一個框架的源碼分析?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
定位到web.xml中的JFinalFilter,在JFinalFilter裏面的init()初始化如下參數:框架
initActionMapping(); initHandler(); initRender(); initOreillyCos(); initTokenManager();
temp = Class.forName(configClass).newInstance();
jfinalConfig = (JFinalConfig)temp;源碼分析
jfinal.init(jfinalConfig, filterConfig.getServletContext())ui
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); }
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); }
private void initActionMapping() { actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors()); actionMapping.buildActionMapping(); Config.getRoutes().clear(); }
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能夠分爲程序員定義的和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進行初始化