源碼有毒:Jfinal源碼解析(二)
源碼有毒:Jfinal源碼解析(三)
private void initActionMapping() {
actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors());
actionMapping.buildActionMapping();
Config.getRoutes().clear();
}
在buildActionMapping()方法之後,把routes信息和攔截器裝載到了actionMapping當中,並且把Config中的Routes信息制空,便於垃圾回收器回收。
回到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;
}
簡單看下initHandler()
private void initHandler() {
Handler actionHandler = new ActionHandler(actionMapping, constants);
handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler);
}
看下getHandler方法
public static Handler getHandler(List<Handler> handlerList, Handler actionHandler) {
Handler result = actionHandler;
for (int i=handlerList.size()-1; i>=0; i--) {
Handler temp = handlerList.get(i);
temp.next = result;
temp.nextHandler = result;
result = temp;
}
return result;
}
這裏獲取到了Constants中的HandlerList,和新創建的ActionHandler構建成了一個Handler鏈,並且返回鏈頂的Handler
initRender();中初始化了JFinal中的render視圖信息
initOreillyCos();中則初始化了文件上傳插件
回到JFinalFilter的init方法
public void init(FilterConfig filterConfig) throws ServletException {
createJFinalConfig(filterConfig.getInitParameter("configClass"));
if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)
throw new RuntimeException("JFinal init error!");
handler = jfinal.getHandler();
constants = Config.getConstants();
encoding = constants.getEncoding();
jfinalConfig.afterJFinalStart();
String contextPath = filterConfig.getServletContext().getContextPath();
contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
}
init中接下來的代碼就比較輕鬆了,爲成員變量handler、constants、encoding、contextPathLength賦值,順便調用了jfinalConfig.afterJFinalStart();方法,到這裏整個框架的初始化完成