jfinal的入口:
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>com.demo.common.DemoConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
demo项目中的web.xml定义的com.jfinal.core.JFinalFilter,是jfinal的核心拦截器,拦截所有请求,是所有web请求的入口。
fiter的生命周期决定,web程序启动时,其init()方法会被web容器自动调用,所以final的初始化就是从此处开始的。
init()
public void init(FilterConfig filterConfig) throws ServletException {
// 1.根据web.xml中配置的configClass利用反射获取实例并向上转型为JFinalConfig。
createJFinalConfig(filterConfig.getInitParameter("configClass"));
// 2.根据web容器传入的filterConfig对象和上一步创建的jfinalConfig对象进行jfinal的初始化,
// jfinal对象为Jfinal类的实例,JFinal为单例且被final修饰。
if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)
throw new RuntimeException("JFinal init error!");
// 3.获取处理器handler
handler = jfinal.getHandler();
// 4.获取常量,此常量在createJFinalConfig()时被填充进Config对象,Config的所有域和方法都为static,预定义的config都为final
constants = Config.getConstants();
// 5.获取字符编码,默认为utf-8
encoding = constants.getEncoding();
// 6.回调函数,默认实现为空
jfinalConfig.afterJFinalStart();
// 7.获取contextPath,demo项目中contextPath为空
String contextPath = filterConfig.getServletContext().getContextPath();
// 8.根据contextPath得到contextPathLength,暂时不明contextPathLength用处
contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0
: contextPath.length());
}
步进分析
- 根据configClass常量利用反射得到实例并向上转型为父类JFinalConfig,利用了模板方法模式的思想
- jfinal核心初始化方法,后续详细探究
- 345678步如注释
jfinal核心初始化方法jfinal.init()分析
boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
this.contextPath = servletContext.getContextPath();
// 1.初始化PathKit的webRootPath变量,为当前项目的绝对路径
initPathUtil();
// 2.配置Jfinal,configJfinal方法会配置用户自定义的constants,routs,plugins,handles,interceptors(全局拦截器)
Config.configJFinal(jfinalConfig);
// 3.获取自定义配置之后的constants
constants = Config.getConstants();
// 4.initActionMapping
initActionMapping();
// 5.initHandler
initHandler();
// 6.initRender
initRender();
// 7.initOreillyCos
initOreillyCos();
// 8.initI18n
initI18n();
// 9.initTokenManager
initTokenManager();
return true;
}
1,3:如注释
4-9:随后具体分析
Config.configJFinal(jfinalConfig)分析
static void configJFinal(JFinalConfig jfinalConfig) {
//