JFinal源码解析:2.JFinal初始化

用Jfinal进行开发的第一步将 jfinal-xxx.jar与jetty-server-8.1.8.jar拷贝至项目WEB-INF\lib下,然后修改web.xml文件:

<!-- jfinal 配置  start -->
  <filter>
  	<filter-name>jfinal</filter-name>
  	<filter-class>com.jfinal.core.JFinalFilter</filter-class>
  	<init-param>
		<param-name>configClass</param-name>
		<param-value>com.mc.trafficservice.config.JConfig</param-value>
	</init-param>
  </filter>
  <filter-mapping>
	<filter-name>jfinal</filter-name>
	<url-pattern>/*</url-pattern>
  </filter-mapping>
<!-- jfinal 配置  end -->

其中,配置文件中的com.mc.trafficservice.config.JConfig是我们自己写的项目配置类的全路径名。启动项目时,会进入com.jfinal.core.JFinalFilter中的init(FilterConfig filterConfig)方法:

public void init(FilterConfig filterConfig) throws ServletException {
	
	createJFinalConfig(filterConfig.getInitParameter("configClass"));
	
	if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)
		throw new RuntimeException("JFinal init error!");
	
	handler = jfinal.getHandler();
	constants = Config.getConstants();
	encoding = constants.getEncoding();
	jfinalConfig.afterJFinalStart();
	
	String contextPath = filterConfig.getServletContext().getContextPath();
	contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());
}

首先执行第一行代码createJFinalConfig(filterConfig.getInitParameter("configClass"));

createJFinalConfig(String configClass)方法如下所示:

private 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");
}

这个方法的作用就是取出配置在web.xml中我们自己写com.mc.trafficservice.config.JConfig类进行实例化。通过filterConfig.getInitParameter("configClass")取出全类名"com.fw.trafficservice.config.JConfig",然后在createJFinalConfig(String configClass)方法内部的temp = Class.forName(configClass).newInstance();进行实例化。

现在回过头来看看init(FilterConfig filterConfig)方法内的第二行代码:

if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)

    throw new RuntimeException("JFinal init error!");

我们来看看JFinal.init(JFinalConfig jfinalConfig, ServletContext servletContext)方法具体做了些什么:

boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
	
	//获取servletContext
	this.servletContext = servletContext;
	//初始化项目根路径,比如我的项目名是/xxx_server,那么this.contextPath的值就为"/xxx_server"
	this.contextPath = servletContext.getContextPath();
	
	initPathUtil();
	
	Config.configJFinal(jfinalConfig);	// start plugin and init logger factory in this method
	constants = Config.getConstants();
	
	initActionMapping();
	initHandler();
	initRender();
	initOreillyCos();
	initTokenManager();
	
	return true;
}
(暂时写到这,后续再更新......)




猜你喜欢

转载自blog.csdn.net/qq9808/article/details/80423287
今日推荐