首页 > 编程知识 正文

JFinal框架源码分析(一)——JFinal项目的启动

时间:2023-05-04 22:56:47 阅读:235589 作者:1041

疑问:

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请求。

// 得到请求的ActionAction action = actionMapping.getAction(target, urlPara);// 初始化ControllerController 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进行初始化

转载于:https://www.cnblogs.com/Erma/p/10293147.html

margin

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。