JFinal框架源码分析(⼀)——JFinal项⽬的启动疑问:
1、如何开启⼀个框架的源码分析?
2、如何实现⽀持 web 项⽬⽆需 l 配置⽂件,便于嵌⼊式整合 jetty、undertow
3、责任链模式? Handle的初始化过程?
4、Route是如何被加载的?
项⽬⼊⼝
public static void main(String[] args) {
JFinal.start("WebRoot",8787,"/");
}
启动过程:WebRoot-->Web-INF--&l
Jfinal初始化
定位到l中的JFinalFilter,在JFinalFilter⾥⾯的init()初始化以下参数:
initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();
在l得到具体的配置⽂件
temp = Class.forName(configClass).newInstance();
jfinalConfig = (JFinalConfig)temp;
真正的初始化过程
jfinal.init(jfinalConfig, ServletContext())
然后再去看看jfinal.init()
boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
initPathUtil();
constants = Constants();
initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();
return true;
}
private void initTokenManager() {
ITokenCache tokenCache = TokenCache();
if (tokenCache != null)
TokenManager.init(tokenCache);
}
由于Handler是责任链模式,这是只是得到链的第⼀个元素
private void initHandler() {
Handler actionHandler = new ActionHandler(actionMapping, constants);
//
handler = Handlers().getHandlerList(), actionHandler);
}
private void initOreillyCos() {
OreillyCos.BaseUploadPath(), MaxPostSize(), Encoding());
}
private void initPathUtil() {
String path = RealPath("/");
PathKit.setWebRootPath(path);
}
private void initRender() {
<().init(constants, servletContext);
}
运⽤反射设置好了Route,即把URI和Controller进⾏了匹配
private void initActionMapping() {
actionMapping = new Routes(), Interceptors());
actionMapping.buildActionMapping();
}
在figJFinal(jfinalConfig)⾥⾯可以看到:
Config order: constant, route, plugin, interceptor, handler
JFinalConfig其实是我们⾃⼰实现JFinalConfig的⼀个类这⾥得到具体的配置
static void configJFinal(JFinalConfig jfinalConfig) {
}
Handler
Handler可以分为程序员定义的和Jfinal⾃带的ActionHandle,⽽这⾥⾃定义的Handler只需要实现Handler接⼝,然后再注册到JFinalHandler⾥⾯就可以了。下⾯主要是讨论ActionHandler。
在JFinal.initHandler()这个⽅法
private void initHandler() {
Handler actionHandler = new ActionHandler(actionMapping, constants);
handler = Handlers().getHandlerList(), actionHandler);
}
可以看到在这⾥注册了⼀个ActionHandler,ActionHandler⽤于处理客户端向URI请求。
// 得到请求的Action
Action action = Action(target, urlPara);
// 初始化Controller
Controller controller = ControllerClass().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进⾏初始化
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论