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>java
爲何要這麼設置??? 其實JFinal中這樣設置並沒有道理,由於這個用來實際上是Filter,就像之前咱們設置自定義Filter的方式是同樣的,這樣設置用戶,當容器運行的時候就,這個Filter就會被加載,而後依次會執行intit(),doFilter(),destroy()的方法,至於init(),doFilter(),destroy()方法何時執行,爲何會執行,已經超出了咱們這個研究的課題,有需求的程序員們本身去Google吧程序員
JFinalFilter 是什麼? 今天咱們看的文件時一個叫JFinalFilter.java的文件,其中關鍵的代碼是這樣的: 首先看這個類的定義:web
public final class JFinalFilter implements Filter{ ..... }app
JFinalFilter 的init()方法 很明顯,他繼承了一個Filter,說明JFinalFilter,明眼人一看都知道這個確定也是一個Filter啊。咱們知道,Filter再被加載的時候會首先進入一個init()的方法,JFinal中這個方法中有一下的幾點,看代碼:框架
String initParam = filterConfig.getInitParameter("configClass");函數
這一句是用來加載web.xml中初始化參數的」configClass」的值,這也就是爲何要在Web.xml中設置url
<init-param> <param-name>configClass</param-name> <param-value>com.mysite.common.DemoConfig</param-value> </init-param>日誌
這個參數的最根本的緣由,有人若是不明白 那咱們繼續看。 createJFinalConfig(initParam)幹些啥? 在這個方法中有一個叫createJFinalConfig(initParam)的方法,看方法名就知道這個確定是用來建立JFinalConfig對象的一個方法啊,對吧,因此咱們要看看裏面發生了些什麼? 首先 先看看configClass 是否存在,若是不存在的話,就給出異常提示,拋出的異常是這樣code
throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml"); 因此看到這個信息,你的xml中沒有配置configClass這個參數了xml
好了 當咱們正確的配置了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的時候而準備的 四、一下的方法也是在咱們自定義的Config類中的方法,也會在初始化的時候被執行 jfinalConfig.configRoute(routes); jfinalConfig.configPlugin(plugins); startPlugins(); jfinalConfig.configInterceptor(interceptors); jfinalConfig.configHandler(handlers);
五、 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);
這些主要就是寫常量或者之類的設置了 當這些個完成之後,整個初始化大概的過程就完成了,其餘的這個過程當中主要還有不少細節,須要慢慢的分析,下次再吹