JFinalFilter

1、入口->JFinalFilter 位于 web.xml 实现了 javax.servlet.Filter 接口

属性: Handler、

            Encoding、

             JfinalConfig、

            Constants、

             Jfinal、

            Logger 

等。

方法:init() 

    (1)

        //从web.xml文件中,根据configClass查找继承 JFinalConfig 的自定义类

        CreateJFinalConfig(filterConfig.getInitParameter("configClass"));

        - >用于初始化 JfinalConfig 失败则抛出异常

    (2)

        //jfinalConfig在上面已经进行初始化。方法返回Boolean判断初始化成功否

        Jfinal.init(jfinalConfig, filterConfig.getServletContext())

        ->进入该方法,可以看到:

            <1>

            This.servletContext = servletContext;

            <2>

            This.contextPath = servletContext.getContextPath();

            <3>

             InitPathUtil();

            ->获取项目相对路径

            <4>

            Config.configJFinal(jfinalConfig);

            ->执行了自定义 DemoConfig 的 7 个方法

                其中

                JfinalConfig.configConstant(constants);

                InitLoggerFactory();

                ->用于初始化日志工具

                JfinalConfig.configRoute(routes);

                JfinalConfig.configPlugin(plugins);

                StartPlugins(); // very important!!!

                ->用于启动插件

                JfinalConfig.configInterceptor(interceptors);

                JfinalConfig.configHandler(handlers);

            ->其他 5 个方法用于给属性 Constants

                                                        Routes

                                                        Plugins

                                                        Interceptors

                                                        Handlers

                 赋值。

            <5>

                Constants = Config.getConstants();

                ->属性 Constants 用于配置常量 下面的几个方法需要用到加载的常量

            <6>

                InitActionMapping();

                ->这个方法重要的地方,在于里面的 BuildActionMapping() 方法。

                    涉及到 Action 的映射。一者加载 Routes 二者加载 Interceptors


            <7>

                 InitHandler();

                ->用于初始化处理器 (暂时没有怎么使用过,需进一步了解)

            <8>

                InitRender();

                ->这个方法重要的地方,在于里面的 

                    RenderFactory.init(constants, servletContext) 方法。

                    涉及到多种视图的初始化,例如:

                        InitFreeMarkerRender(servletContext);

                         InitVelocityRender(servletContext);

                        InitJspRender(servletContext);

                        InitFileRender(servletContext);

                    等。


            <9>

                InitOreillyCos();

                ->初始化文件上传的相关设置

                涉及到的类有     MultipartRequest

                                          OreillyCos

                等。

            <10>

                InitI18n();

                    ->初始化国际化相关信息 

            <11>

                InitTokenManager();

                ->初始化 Token 信息,如果不设置 setTokenCache 

                    则默认使用 HttpSession 生成 token

        (3)

        Handler=jfinal.getHandler();


        (4)

        Constants=Config.getConstants();


        (5)

        Encoding=constants.getEncoding();


        (6)

        JfinalConfig.afterJFinalStart();

方法:doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

        (1)

        HttpServletRequest request = (HttpServletRequest)req;

        HttpServletResponse response = (HttpServletResponse)res;

        (2)

        request.setCharacterEncoding(Encoding);

        (3)

        String target = request.getRequestURI();

        if (contextPathLength != 0)

            target = target.substring(contextPathLength);

        (4)

        boolean[] isHandled = {false};

        try {

            handler.handle(target, request, response, isHandled);

         }

        catch (Exception e) {

            if (log.isErrorEnabled()) {

                String qs = request.getQueryString();

                log.error(qs == null ? target : target + "?" + qs, e);

            }

        }

        if (isHandled[0] == false)

            chain.doFilter(request, response);

            ->该方法会让拦截器进入下一个方法。

方法:destroy()

->生命周期完结。

完成 JFinalConfig 中对项目的一系列加载。


你可能感兴趣的:(JFinalFilter)