JFinal学习之JFinalConfig

秦安宁
2023-12-01

JFinalConfig子类需要实现六个抽象方法:

你好! 这是我学习 JFinal 所写的博客。如果你想学习如何使用JFinal, 可以仔细阅读这篇文章,了解一下JFinal的基本语法知识。

1.configConstant()方法

用来配置JFinal常量值,如开发模式常量devMode的配置

public void configConstant(Constants me) {
    me.setDevMode(true);
}

2.configRoute()方法

想了很久还是只介绍一种有利于开发的模式,其他的请查看官网文档,但不建议使用。具体请看JFinal官网文档

路由拆分、模块化

JFinal路由可以进行拆分配置,这对大规模团队开发十分有用,以下是代码示例

/**
 *配置系统前端路由
**/
public class FrontRoutes extends Routes {
    public void config() {
    	//使用setBaseViewPath(…)设置了Controller.render(view)时使用的baseViewPath
       setBaseViewPath("/view/front");
       add("/", IndexController.class);
       add("/blog", BlogController.class);
    }
}
/**
 *配置系统后台路由
**/
public class AdminRoutes extends Routes {
    public void config() {
    	//使用setBaseViewPath(…)设置了Controller.render(view)时使用的baseViewPath
       setBaseViewPath("/view/admin");
       /*
       *AdminRoutes 还通过addInterceptor(new AdminInterceptor())添加了 Routes 
       *级别的拦截器,该拦截器将拦截 AdminRoutes 中添加的所有 Controller,相当于业务层
       *的inject拦截器,会在class拦截器之前被调用。这种用法可以避免在后台管理这样的模块
       *中的所有class上使用@Before(AdminInterceptor.class),减少代码冗余。
       */
       addInterceptor(new AdminInterceptor());
       add("/admin", AdminController.class);
       add("/admin/user", UserController.class);
    }
}
public class MyJFinalConfig extends JFinalConfig {
	/*
	*MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。使用这种拆分配置	
	*不仅可以让MyJFinalConfig文件更简洁,而且有利于大规模团队开发,避免多人同时修改
	*MyJFinalConfig时的版本冲突
	*/
    public void configRoute(Routes me) {
       me.add(new FrontRoutes());  // 前端路由
       me.add(new AdminRoutes());  // 后端路由
    }
    public void configConstant(Constants me) {}
    public void configEngine(Engine me) {}
    public void configPlugin(Plugins me) {}
    public void configInterceptor(Interceptors me) {}
    public void configHandler(Handlers me) {}
}

3.configEngine()方法

public void configEngine(Engine me) {
		// devMode 配置为 true,将支持模板实时热加载
		me.setDevMode(PropKit.getBoolean("devMode"));
		// 添加共享函数,等效于在每个页面中添加#include("layout.html")
		me.addSharedFunction("/WEB-INF/enjoy/_layout.html");
 
		// 分享静态方法
		// me.addSharedStaticMethod(Share.class);
		// 分享所有方法
		// me.addSharedMethod(Share.class);
		// me.addSharedMethod(new Share());
		// 分享所有变量和方法
		me.addSharedObject("share", new Share());
}

4.configPlugin()方法

此方法用来配置JFinal的Plugin, JFinal插件架构是其主要扩展方式之一,可以方便地创建插件并应用到项目中去。

public void configPlugin(Plugins me) {
	//配置了Druid数据库连接池插件与ActiveRecord数据库访问插件
    DruidPlugin dp = new DruidPlugin(jdbcUrl, userName, password);
    me.add(dp);
    
    ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
    arp.addMapping("user", User.class);
    me.add(arp);
}

5.configInterceptor()方法

此方法用来配置JFinal的全局拦截器,全局拦截器将拦截所有 action 请求,除非使用@Clear在Controller中清除

public void configInterceptor(Interceptors me) {
	//配置了名为AuthInterceptor的拦截器
    me.add(new AuthInterceptor());
}

6.configHandler()方法

此方法用来配置JFinal的Handler,如下代码配置了名为ResourceHandler的处理器,Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。

public void configHandler(Handlers me) {
    me.add(new ResourceHandler());
}

具体用法可以参考 jfinal 源码中给出的几个功能的官方实现:https://gitee.com/jfinal/jfinal/tree/master/src/main/java/com/jfinal/ext/handler

7.onStart()、onStop() 回调配置

在 JFinalConfig 继承类中可以添加 onStart() 与 onStop(),JFinal 会在系统启动完成之后以及系统关闭之前分别回调这两个方法,这两个方法可以很方便地在项目启动后与关闭前让开发者有机会进行额外操作,如在系统启动后创建调度线程或在系统关闭前写回缓存。

// 系统启动完成后回调
public void onStart() {
}
 
// 系统关闭之前回调
public void onStop() {
}

注意:jfinal 3.6 版本之前这两个方法名为:afterJFinalStart() 与 beforeJFinalStop()。为减少记忆成本、代码输入量以及输入手误的概率,jfinal 3.6 版本改为了目前更简短的方法名。老方法名仍然被保留,仍然可以使用,方便老项目升级到 jfinal 最新版本。

8.PropKit 读取配置

PropKit工具类用来读取外部键值对配置文件,PropKit可以极度方便地在系统任意时空使用,配置文件的格式如下:

userName=james
email=no-reply@jfinal.com
devMode=true

如下是 PropKit 代码示例:

PropKit.use("config.txt");
String userName = PropKit.get("userName");
String email = PropKit.get("email");
 
// Prop 配合用法
Prop p = PropKit.use("config.txt");
Boolean devMode = p.getBoolean("devMode");

在项目中使用的实例:

public class AppConfig extends JFinalConfig {
  public void configConstant(Constants me) {
    // 第一次使用use加载的配置将成为主配置,可以通过PropKit.get(...)直接取值
    PropKit.use("a_little_config.txt");
    me.setDevMode(PropKit.getBoolean("devMode"));
  }
 
  public void configPlugin(Plugins me) {
    // 非第一次使用use加载的配置,需要通过每次使用use来指定配置文件名再来取值
    String redisHost = PropKit.use("redis_config.txt").get("host");
    int redisPort = PropKit.use("redis_config.txt").getInt("port");
    RedisPlugin rp = new RedisPlugin("myRedis", redisHost, redisPort);
    me.add(rp);
 
    // 非第一次使用 use加载的配置,也可以先得到一个Prop对象,再通过该对象来获取值
    Prop p = PropKit.use("db_config.txt");
    DruidPlugin dp = new DruidPlugin(p.get("jdbcUrl"), p.get("user")…);
    me.add(dp);
  }
}

如上代码所示,PropKit可同时加载多个配置文件,第一个被加载的配置文件可以使用PorpKit.get(…)方法直接操作,非第一个被加载的配置文件则需要使用PropKit.use(…).get(…)来操作。

PropKit 的使用并不限于在 YourJFinalConfig 中,可以在项目的任何地方使用。
此外PropKit.use(…)方法在加载配置文件内容以后会将数据缓存在内存之中,
可以通过PropKit.useless(…)将缓存的内容进行清除。

如有疑问,请加qq群:324847156

 类似资料: