博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JFinal源码分析------初始化那些事儿
阅读量:5977 次
发布时间:2019-06-20

本文共 3963 字,大约阅读时间需要 13 分钟。

hot3.png

JFinal使用配置: 在web.xml中配置信息一下的信息 <filter> <filter-name>jfinal</filter-name> <filter-class>com.JFinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <param-value>com.mysite.common.DemoConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

为什么要这么设置??? 其实JFinal中这样设置并无道理,因为这个用来其实是Filter,就像以前我们设置自定义Filter的方式是一样的,这样设置用户,当容器运行的时候就,这个Filter就会被加载,然后依次会执行intit(),doFilter(),destroy()的方法,至于init(),doFilter(),destroy()方法什么时候执行,为什么会执行,已经超出了我们这个研究的课题,有需求的程序员们自己去Google吧

JFinalFilter 是什么? 今天我们看的文件时一个叫JFinalFilter.java的文件,其中关键的代码是这样的: 首先看这个类的定义:

public final class JFinalFilter implements Filter{   ..... }

JFinalFilter 的init()方法 很明显,他继承了一个Filter,说明JFinalFilter,明眼人一看都知道这个肯定也是一个Filter啊。我们知道,Filter再被加载的时候会首先进入一个init()的方法,JFinal中这个方法中有一下的几点,看代码:

String initParam = filterConfig.getInitParameter("configClass");

这一句是用来加载web.xml中初始化参数的”configClass”的值,这也就是为什么要在Web.xml中设置

<init-param> <param-name>configClass</param-name> <param-value>com.mysite.common.DemoConfig</param-value> </init-param>

这个参数的最根本的原因,有人如果不明白 那我们继续看。 createJFinalConfig(initParam)干些啥? 在这个方法中有一个叫createJFinalConfig(initParam)的方法,看方法名就知道这个肯定是用来创建JFinalConfig对象的一个方法啊,对吧,所以我们要看看里面发生了些什么? 首先 先看看configClass 是否存在,如果不存在的话,就给出异常提示,抛出的异常是这样

throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml"); 所以看到这个信息,你的xml中没有配置configClass这个参数了

好了 当我们正确的配置了xml中的信息之后,重点的来了

Object temp = Class.forName(configClass).newInstance();

这个很明显是通过这个反射来动态的创建一个实例,这个实例的类型是一个Object,至于为什么会这样,不太清楚,没有关系,看看后面的就大概会清楚了

if (temp instanceof JFinalConfig){ jfinalConfig = (JFinalConfig)temp; } else{ throw new RuntimeException("Can not create instance of class: " + configClass + ". Please check the config in web.xml"); }

这个就是判断是不是一个JFianlConfig的对象实例,如果是的话,就将他转型成为JFinalConfig对象,如果不是,就抛出异常信息。

好了 到这里 需要插几句题外话,说几个问题:

为什么我们需要设置一个类专门要继承JfinalConfig? 答案就是我们刚刚说到的那个判断,判断我们动态生成的那个对象实例,是不是JfinalConfig对象的实例,所以我们需要有一个类来继承JFinalConfig类(当然,这只是其中的一个原因),还有其他的原因就是,当你继承了这个JfianlConfig类以后,会让你重载一些个方法(configConstant(),configHandler(),configInterceptor(),configPlugin(),configRoute())这些个方法,在JfinalFilter的初始化过程中是被执行的,所以我们必须要有一个类来专门继承这个JfinalConfig类,也就是我们要专门在xml重要给只文章开始时候的那些配置

好了 继续刚刚的话题,现在我们已经有了这个jfinalConfig对象实例了,下面看看该做什么了!! 对了 下面就是该初始化话一些和JFinal框架相关的东西了

jfinal.init(jfinalConfig,filterConfig.getServletContext()) 在这个这个方法中主要又有以下的步骤: initPathUtil();//这个就是初始化项目的路径,至于为什么要这样暂时没有弄明白 Config.configJFinal(jfinalConfig); initLoggerFactory();//这个是日志相关的,说白了就是为了使用了Log4j的时候而准备的 4、一下的方法也是在我们自定义的Config类中的方法,也会在初始化的时候被执行 jfinalConfig.configRoute(routes); jfinalConfig.configPlugin(plugins); startPlugins(); jfinalConfig.configInterceptor(interceptors); jfinalConfig.configHandler(handlers);

5、 initActionMapping();//初始化请求地址映射 initHandler(); initRender(); initOreillyCos(); initI18n(); initTokenManager();

以上的方法也是主要做初始化工作

分开说 Config.configJFinal(jfinalConfig); 先看看这个函数干了什么 进入到这个里面,我们看看到了以下的代码:

jfinalConfig.configConstant(constants);//配置常量信息					initLoggerFactory();	jfinalConfig.configRoute(routes);	jfinalConfig.configPlugin(plugins);						startPlugins();	// very important!!!	jfinalConfig.configInterceptor(interceptors);	jfinalConfig.configHandler(handlers);

这个JfinalConfig就是我们自己定义的那个config,这个里面的方法就是我们复写的那些个方法,也就是说明在初始化的时候,通过JFinalConfig对象就执行到了我们自定的那些个方法中,其实我们在追一下的话就应该知道,他是怎么做的,在JfinalConfig中,这些个方法都是抽象方法,这是需要我们自己去实现的,这就是一框架的思想,所有关于具体实现的东西都交给实现的人去做,具体做什么根本就不会关心,通过了Config.configJFinal(jfinalConfig);就完全将我们自定义的东西给执行了

回到JfianlFilter 然后我们回到JfianlFilter中, handler = jfinal.getHandler(); constants = Config.getConstants(); encoding = constants.getEncoding(); jfinalConfig.afterJFinalStart(); String contextPath = filterConfig.getServletContext().getContextPath(); contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length()); System.out.println(contextPathLength);

这些主要就是写常量或者之类的设置了 当这些个完成以后,整个初始化大概的过程就完成了,其他的这个过程中主要还有很多细节,需要慢慢的分析,下次再吹

转载于:https://my.oschina.net/u/257950/blog/129830

你可能感兴趣的文章
微软最新更新程序 再次针对Windows XP盗版
查看>>
Incredible StartPage
查看>>
我常用的tar
查看>>
likely,unlikely宏与GCC内建函数__builtin_expect()
查看>>
Start Java program as Linux daemon
查看>>
深入理解JavaScript系列(47):对象创建模式(上篇)
查看>>
Install Wise制作软件安装包
查看>>
xml学习笔记与心得
查看>>
Asp.net MVC23 使用Areas功能的常见错误
查看>>
在Word中生成随机的样本文本
查看>>
Android之创建自定义属性
查看>>
SCP不需要密码
查看>>
iOS学习系列 - MonoTouch绑定原生Obj-C静态库的实现
查看>>
koogra--Excel文件读取利器
查看>>
广播通信
查看>>
绑定到异步的ObservableCollection
查看>>
使用beetle简单地实现高效的http基础服务
查看>>
坚果云开发团队分享高效代码审查经验
查看>>
光棍节程序员闯关秀 segmentfault 网站的一个游戏
查看>>
不考虑线程安全的初级单例C++代码
查看>>