Jfinal Controller簡介(3)

Controller是MVC中的C,用來接收和處理瀏覽器提交的信息的核心類.

Jfinal的訪問流程:
在這裏插入圖片描述
當一個請求發送過來的時候,會去調用JfinalFilter過濾器,然後逐層調用Handle,Handle是實現JfinalFilter類中configHandler(Handlers handlers)方法自己加的,沒有配置Handle的話會默認走ActionHandler,

這裏我們簡單的分析下JfinalFilter的doFilter方法:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		//獲取request和response
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)res;
        //設置在實現類中設置的字符編碼
        request.setCharacterEncoding(this.encoding);
        //相對路徑
        String target = request.getRequestURI();
        if (this.contextPathLength != 0) {
            target = target.substring(this.contextPathLength);
        }

        boolean[] isHandled = new boolean[]{false};

        try {
        	//這邊的handle會去實現類configHandler(Handlers handlers)中找自己定義的handle,如果沒有,會默認執行ActionHandler中的handle()方法.
            this.handler.handle(target, request, response, isHandled);
        } catch (Exception var10) {
            if (log.isErrorEnabled()) {
                String qs = request.getQueryString();
                log.error(qs == null ? target : target + "?" + qs, var10);
            }
        }

        if (!isHandled[0]) {
            chain.doFilter(request, response);
        }

    }

ActionHandle中的handle方法

    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
    	//target.indexOf(46)是看target中有沒有包含"."
        if (target.indexOf(46) == -1) {
            isHandled[0] = true;
            String[] urlPara = new String[]{null};
            Action action = this.actionMapping.getAction(target, urlPara);
            if (action == null) {
            	//找不到映射方法,直接返回404
                if (log.isWarnEnabled()) {
                    String qs = request.getQueryString();
                    log.warn("404 Action Not Found: " + (qs == null ? target : target + "?" + qs));
                }

                renderManager.getRenderFactory().getErrorRender(404).setContext(request, response).render();
            } else {
                Controller controller = null;

                try {
                    String actionUrl;
                    try {
                        controller = this.controllerFactory.getController(action.getControllerClass());
                        controller.init(action, request, response, urlPara[0]);
                        if (this.devMode) {
                        //開發模式
                            if (ActionReporter.isReportAfterInvocation(request)) {
                            //先執行方法後打印日誌
                                (new Invocation(action, controller)).invoke();
                                ActionReporter.report(target, controller, action);
                            } else {
                            //先打印日誌,後執行方法
                                ActionReporter.report(target, controller, action);
                                (new Invocation(action, controller)).invoke();
                            }
                        } else {
                        	//不是開發模式,直接執行方法
                            (new Invocation(action, controller)).invoke();
                        }

                        Render render = controller.getRender();
                        if (!(render instanceof ForwardActionRender)) {
                            if (render == null) {
                                render = renderManager.getRenderFactory().getDefaultRender(action.getViewPath() + action.getMethodName());
                            }

                            render.setContext(request, response, action.getViewPath()).render();
                            return;
                        }

                        actionUrl = ((ForwardActionRender)render).getActionUrl();
                        if (target.equals(actionUrl)) {
                            throw new RuntimeException("The forward action url is the same as before.");
                        }

                        this.handle(actionUrl, request, response, isHandled);
                    } catch (RenderException var17) {
                        if (log.isErrorEnabled()) {
                            actionUrl = request.getQueryString();
                            log.error(actionUrl == null ? target : target + "?" + actionUrl, var17);
                        }

                        return;
                    } catch (ActionException var18) {
                        int errorCode = var18.getErrorCode();
                        String msg = null;
                        if (errorCode == 404) {
                            msg = "404 Not Found: ";
                        } else if (errorCode == 401) {
                            msg = "401 Unauthorized: ";
                        } else if (errorCode == 403) {
                            msg = "403 Forbidden: ";
                        }

                        String qs;
                        if (msg != null) {
                            if (log.isWarnEnabled()) {
                                qs = request.getQueryString();
                                log.warn(msg + (qs == null ? target : target + "?" + qs));
                            }
                        } else if (log.isErrorEnabled()) {
                            qs = request.getQueryString();
                            log.error(qs == null ? target : target + "?" + qs, var18);
                        }

                        var18.getErrorRender().setContext(request, response, action.getViewPath()).render();
                        return;
                    } catch (Exception var19) {
                        if (log.isErrorEnabled()) {
                            actionUrl = request.getQueryString();
                            log.error(actionUrl == null ? target : target + "?" + actionUrl, var19);
                        }

                        renderManager.getRenderFactory().getErrorRender(500).setContext(request, response, action.getViewPath()).render();
                        return;
                    }
                } finally {
                    if (controller != null) {
                        controller.clear();
                    }

                }

            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章