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();
                    }

                }

            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值