1. JFinal類 初始化ActionMapping java
private void initActionMapping() { actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors());//將配置路徑映射、攔截器,傳給ActionMapping類 actionMapping.buildActionMapping();//創建ActionMapping映射 }
2. ActionMapping類 數組
目的:獲得請求URL與請求執行者Action的映射關係,保存到map中app
Action中保存有攔截器,執行請求所須要的Controller類及方法,返回頁面的目錄等信息ui
Interceptor[]url
從配置裏獲得global級別攔截器spa
從controller的註釋聲明(@before)獲得controller級別攔截器code
依靠反射的方法遍歷controller的方法,從方法的註釋聲明(@before)獲得method級別攔截器繼承
URL:ActionKey+Methodkeyget
從配置裏獲得ActionKeyit
從method上的註釋聲明獲得ActionKey,沒有聲明的默認爲method名
new 一個Action保存interceptor[],controller,method等信息
將URL,Action添加到map裏保存,獲得映射關係 map.add(URL,Action)
void buildActionMapping() { mapping.clear(); Set<String> excludedMethodName = buildExcludedMethodName();//獲得Controller類(父類)裏的無參方法 InterceptorBuilder interceptorBuilder = new InterceptorBuilder();//攔截器建立類(保存攔截器) Interceptor[] defaultInters = interceptors.getInterceptorArray();//在config類裏咱們配置的全局攔截器 interceptorBuilder.addToInterceptorsMap(defaultInters);//把全局攔截器添加到map裏保存 for (Entry<String, Class<? extends Controller>> entry : routes.getEntrySet()) {//遍歷config類裏咱們配置的請求-Controller映射 add("/", ManagerController.class); Class<? extends Controller> controllerClass = entry.getValue();//獲得控制器Controller類 Interceptor[] controllerInters = interceptorBuilder.buildControllerInterceptors(controllerClass);//獲得控制器上的攔截器 Method[] methods = controllerClass.getMethods();//獲得控制器的全部方法 for (Method method : methods) { String methodName = method.getName(); if (!excludedMethodName.contains(methodName) && method.getParameterTypes().length == 0) {//咱們寫的控制器都繼承了Controller父類,同時添加了本身的無參方法,這裏的目的就是獲得咱們本身添加的方法(controller的全部無參方法除去父類裏的無參方法,就是咱們本身添加的方法了)。 Interceptor[] methodInters = interceptorBuilder.buildMethodInterceptors(method);//獲得method上的攔截器 Interceptor[] actionInters = interceptorBuilder.buildActionInterceptors(defaultInters, controllerInters, controllerClass, methodInters, method);//將攔截器按照優先級(global>controller>method)依次保存到actionInters String controllerKey = entry.getKey(); ActionKey ak = method.getAnnotation(ActionKey.class);//獲得該方法上添加的ActionKey聲明(即請求路徑) if (ak != null) {//有聲明則ActionKey爲聲明的值,若是沒有聲明則ActionKey默認爲該方法名,默認index的ActionKey爲「/」值,將請求URL(controllerKey+ActionKey)作爲key,Action做爲value保存到mapping中。Action中保存有攔截器,執行請求所須要的Controller類及方法,返回頁面的目錄等信息 String actionKey = ak.value().trim(); if ("".equals(actionKey)) throw new IllegalArgumentException(controllerClass.getName() + "." + methodName + "(): The argument of ActionKey can not be blank."); if (!actionKey.startsWith(SLASH)) actionKey = SLASH + actionKey; if (mapping.containsKey(actionKey)) { warnning(actionKey, controllerClass, method); continue; } Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey)); mapping.put(actionKey, action); } else if (methodName.equals("index")) { String actionKey = controllerKey; Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey)); action = mapping.put(actionKey, action); if (action != null) { warnning(action.getActionKey(), action.getControllerClass(), action.getMethod()); } } else { String actionKey = controllerKey.equals(SLASH) ? SLASH + methodName : controllerKey + SLASH + methodName; if (mapping.containsKey(actionKey)) { warnning(actionKey, controllerClass, method); continue; } Action action = new Action(controllerKey, actionKey, controllerClass, method, methodName, actionInters, routes.getViewPath(controllerKey)); mapping.put(actionKey, action); } } } } // support url = controllerKey + urlParas with "/" of controllerKey Action actoin = mapping.get("/"); if (actoin != null) mapping.put("", actoin); }
private Set<String> buildExcludedMethodName() {//返回Controller類裏的無參方法 Set<String> excludedMethodName = new HashSet<String>(); Method[] methods = Controller.class.getMethods(); for (Method m : methods) { if (m.getParameterTypes().length == 0)//getParameterTypes獲取該方法的參數數組,這裏是獲得controller的無參方法 excludedMethodName.add(m.getName()); } return excludedMethodName; }
3. InterceptorBuilder 攔截器建立類
@SuppressWarnings("unchecked") void addToInterceptorsMap(Interceptor[] defaultInters) { for (Interceptor inter : defaultInters) intersMap.put((Class<Interceptor>)inter.getClass(), inter); }
/** * Build interceptors of Action * 將攔截器按照優先級(global>controller>method)依次保存到actionInters */ Interceptor[] buildActionInterceptors(Interceptor[] defaultInters, Interceptor[] controllerInters, Class<? extends Controller> controllerClass, Interceptor[] methodInters, Method method) { ClearLayer controllerClearType = getControllerClearType(controllerClass); if (controllerClearType != null) { defaultInters = NULL_INTERCEPTOR_ARRAY; } ClearLayer methodClearType = getMethodClearType(method); if (methodClearType != null) { controllerInters = NULL_INTERCEPTOR_ARRAY; if (methodClearType == ClearLayer.ALL) { defaultInters = NULL_INTERCEPTOR_ARRAY; } } int size = defaultInters.length + controllerInters.length + methodInters.length; Interceptor[] result = (size == 0 ? NULL_INTERCEPTOR_ARRAY : new Interceptor[size]); int index = 0; for (int i=0; i<defaultInters.length; i++) { result[index++] = defaultInters[i]; } for (int i=0; i<controllerInters.length; i++) { result[index++] = controllerInters[i]; } for (int i=0; i<methodInters.length; i++) { result[index++] = methodInters[i]; } return result; }