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