疑問:
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請求。
// 得到請求的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進行初始化