当前位置: 首页 > 工具软件 > JFinal-BBS > 使用案例 >

JFinal的开始-JFinalFilter

萧懿轩
2023-12-01

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的初始化。

 类似资料: