用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;
}
(暂时写到这,后续再更新......)