一、如何开启一个框架的源码分析?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进行初始化