JFinal源碼解析--ActionMapping,Interceptor

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;
    }
相關文章
相關標籤/搜索