原始碼有毒:jfinal原始碼解析(一)
[原始碼有毒:jfinal原始碼解析(二)
jfinalconfig.configinterceptor(interceptors);
@override
public
void
configinterceptor(interceptors me)
新增全域性***,最終會把這裡新增的***儲存到interceptormanager類的singletonmap中
private void addglobalinterceptor(boolean foraction, interceptor... inters)
...略
}
jfinalconfig.confighandler(handlers);
這裡比較簡單,直接把handler儲存到了handlers類的集合中
final
public
class
handlers
public listgethandlerlist()
}
到這裡,就把我們自己寫mianconfig中有所有配置資訊,初始化到config中。
回到jfinal類的init()方法
boolean init(jfinalconfig jfinalconfig, servletcontext servletcontext)
private
void
config.getroutes().clear();
}
setexcludedmethodname =buildexcludedmethodname();
interceptormanager interman = interceptormanager.me();
for (entryclass
<? extends
controller>> entry : routes.getentryset())
else
if (methodname.equals("index")) else
action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath(controllerkey));
throw
new runtimeexception(buildmsg(actionkey, controllerclass, method));
}} if (action != null)
}方法一開始先是呼叫了buildexcludedmethodname()方法返回乙個set集合
private
set buildexcludedmethodname()
return excludedmethodname;
}
其實就是將controller類中不帶引數的方法名獲取處理儲存到set集合中,便於區分使用者自己在controller中編寫的action方法。緊接著獲取了interceptormanager***manager的例項。然後對從config中傳遞進來的routes中的map集合進行了遍歷,依次取出controller的class,然後通過呼叫interceptormanager.createcontrollerinterceptor()方法,取出註解在controller類的***資訊,並儲存到interceptormanager中
interceptor controllerinters = interman.createcontrollerinterceptor(controllerclass);
public interceptor createcontrollerinterceptor(class
<? extends
controller> controllerclass)
接著看
boolean sonofcontroller = (controllerclass.getsuperclass() == controller.class);
method methods = (sonofcontroller ? controllerclass.getdeclaredmethods() : controllerclass.getmethods());
這裡獲取到了controller中的所有action方法,通過判斷是否是controller的子類,來解決我們自己編寫的controller的繼承問題
// 遍歷methods
for (method method : methods)
else
if (methodname.equals("index"))
else
// 最終生成乙個action例項
// controllerkey: 請求controller根路徑
// actionkey:請求method的路徑
// controllerclass:controller的class
// actioninters:***
action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath(controllerkey));
throw
new runtimeexception(buildmsg(actionkey, controllerclass, method));
}
看個具體的例項
public
final
class
extends
routes
}public
class
useraction
extends
controller
}
這裡如果要訪問useraction的login方法,路徑則為localhost:port/user/login
action action = new action(controllerkey, actionkey, controllerclass, method, methodname, actioninters, routes.getviewpath
(controllerkey));
throw new runtimeexception(buildmsg(actionkey, controllerclass, method));
在建立好action之後,把action儲存到了乙個map集合之中,如果集合中已經存在這個action,則丟擲異常 JFinal 原始碼知識點
1 jfinal中自帶json工具類,沒必要匯入其他的轉化包。使用 setattr status success renderjson 會將所有setattr 的,轉化成json格式。2 kit包中定義了一些工具類的擴充套件 例如 1 轉化json的工具 jsonkit.tojson str 2 加...
azkaban web server原始碼解析
azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...
JDK LinkedHashMap原始碼解析
今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...