tomcat下开发、部署JFinal时需要使用web.xml文件,并在该文件中配置一个filter,这个filter就是JFinalFilter,也是这种模式下JFinal的起点。
<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name>
<param-value>central.helper.config.HelperConfig</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web应用程序启动时,web服务器通过web.xml识别到filter,调用其init方法创建Filter的实例对象,完成对象的初始化功能,JFinalFilter的init方法如下:
public void init(FilterConfig filterConfig) throws ServletException {
createJFinalConfig(filterConfig.getInitParameter("configClass"));
jfinal.init(jfinalConfig, filterConfig.getServletContext());
String contextPath = filterConfig.getServletContext().getContextPath();
contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
constants = Config.getConstants();
encoding = constants.getEncoding();
jfinalConfig.afterJFinalStart();
handler = jfinal.getHandler(); // 开始接受请求
}
从上面的代码中可以看到,首先是创建项目自己的JFinalConfig类,方法如下:
protected void createJFinalConfig(String configClass) {
if (configClass == null) {
throw new RuntimeException("Please set configClass parameter of JFinalFilter in web.xml");
}
Object temp = null;
try {
temp = Class.forName(configClass).newInstance();
} catch (Exception e) {
throw new RuntimeException("Can not create instance of class: " + configClass, e);
}
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");
}
}
项目的JFinalConfig类是配置在web.xml中的,从上面的init方法也可以看出是从配置文件里获取配置参数,也就是自己项目中的一个继承自JFinalConfig的config类。
然后进行JFinal初始化:
//JFinal.class 57行
void init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
this.contextPath = servletContext.getContextPath();
initPathKit();
Config.configJFinal(jfinalConfig); // start plugin, init log factory and init engine in this method
constants = Config.getConstants();
initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();
}
在JFinal中的init方法中调用了Config.configJFinal(jfinalConfig)完成项目自己的JFinalConfig方法调用:
/*
* Config.class 50行
* Config order: constant, plugin, route, engine, interceptor, handler
*/
static void configJFinal(JFinalConfig jfinalConfig) {
jfinalConfig.configConstant(constants); initLogFactory(); initEngine();
configPluginWithOrder(1, jfinalConfig);
jfinalConfig.configRoute(routes);
configPluginWithOrder(2, jfinalConfig);
jfinalConfig.configEngine(engine);
configPluginWithOrder(3, jfinalConfig);
jfinalConfig.configInterceptor(interceptors);
configPluginWithOrder(4, jfinalConfig);
jfinalConfig.configHandler(handlers);
configPluginWithOrder(5, jfinalConfig);
}
完成项目自己的JFinalConfig方法调用后,初始化action、handler、render等核心配置。
至此完成Filter的初始化。