JFinal的Routes机制详解

时间:2021-07-19 18:23:41

Routes表示的是JFinal框架所有的路由。可以自定义路由规则,比如利用注解的自动扫描路由器;或者自己定义前端和后端的路由器。

Routes在Config类中定义了一个空的Routes对象,这个对象在configJFinal方法中被传入configRoute方法。

static void configJFinal(JFinalConfig jfinalConfig) {
jfinalConfig.configConstant(constants);initLoggerFactory();
<strong>jfinalConfig.configRoute(routes);</strong>
jfinalConfig.configPlugin(plugins);startPlugins();// very important!!!
jfinalConfig.configInterceptor(interceptors);
jfinalConfig.configHandler(handlers);
}
configJFinal方法在JFinal的init方法中被调用

<pre name="code" class="html">boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) {
this.servletContext = servletContext;
this.contextPath = servletContext.getContextPath();

initPathUtil();

<strong>Config.configJFinal(jfinalConfig);// start plugin and init logger factory in this method</strong>
constants = Config.getConstants();

initActionMapping();
initHandler();
initRender();
initOreillyCos();
initTokenManager();

return true;
}

而这个JFinalConfig就是我们需要继承的抽象类,它有个方法就是 

public abstract void configRoute(Routes me);
我们在我们的继承类中可以调用Routes的
public Routes add(String controllerkey, Class<? extends Controller> controllerClass) {
方法添加路由,也可以调用
public Routes add(Routes routes) {
添加我们自己的路由器,该方法中,首先会调用我们路由器的config(这是个抽象方法)方法,这样我们就能配置好我们的路由规则。
public Routes add(Routes routes) {
if (routes != null) {
<strong>routes.config();// very important!!!
map.putAll(routes.map);
viewPathMap.putAll(routes.viewPathMap);</strong>
}
return this;
}
在config方法中,我们可以调用
public Routes add(String controllerkey, Class<? extends Controller> controllerClass) {
等方法配置路由,这个路由从哪儿来,当然就是我们的事儿了。


下面以AutoBindRoutes为例,剖析一下。

在public class Config extends JFinalConfig{的

public abstract void configRoute(Routes me);
方法中,me.add(new AutoBindRoutes());可以配置路由器。

而AutoBindRoutes 的主要代码为:

public class AutoBindRoutes extends Routes

public void config()
{
<strong> List controllerClasses = ClassSearcher.of(Controller.class).includeAllJarsInLib(this.includeAllJarsInLib).injars(this.includeJars).search();</strong>

ControllerBind controllerBind = null;
for (Class controller : controllerClasses)
controllerBind = (ControllerBind)controller.getAnnotation(ControllerBind.class);
。。。
<strong>add(controllerKey(controller), controller);</strong>
还有些其他的方法可以添加一些包、排除某些类或者包


配置好路由之后,JFinal就知道所有的controllerKey和Controller之间的映射关系。