基于JFinal的web项目需要创建一个继承自JFinalConfig类的子类,该类用于对整个web项目进行配置。
一. JFinalConfig子类需要实现六个抽象方法,如下所示:
public class DemoConfig extends JFinalConfig {
public void configConstant(Constants me) {}
public void configRoute(Routes me) {}
public void configEngine(Engine me) {}
public void configPlugin(Plugins me) {}
public void configInterceptor(Interceptors me) {}
public void configHandler(Handlers me) {}
}
1. configConstant(..)
此方法用来配置JFinal常量值,如开发模式常量devMode的配置,如下代码配置了JFinal运行在开发模式
public void configConstant(Constants me) {
me.setDevMode(true);
}
//此方法用来配置JFinal常量值,如开发模式常量devMode的配置,如下代码配置了JFinal运行在开发模式
// 在开发模式下,JFinal会对每次请求输出报告,如输出本次请求的URL、Controller、Method以及请求所携带的参数。
2. configRoute(..) 此方法用来配置访问路由
public void configRoute(Routes me) {
me.setBaseViewPath("/view");
me.addInterceptor(new FrontInterceptor());
me.add("/hello", HelloController.class);
}
//此方法用来配置访问路由,如下代码配置了将 "/hello" 映射到HelloController这个控制器,
//通过以下的配置,http://localhost/hello 将访问 HelloController.index() 方法,
//而http://localhost/hello/methodName 将访问到 HelloController.methodName() 方法。
//Routes.setBaseViewPath(baseViewPath)方法用于为该Routes 内部的所有Controller设置视图渲染时的基础路径,
//该基础路径与Routes.add(…, viewPath)方法传入的viewPath以及
//Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径,规则如下:
// finalView = baseViewPath + viewPath + view
// 注意:当view以 “/” 字符打头时表示绝对路径,baseViewPath 与 viewPath 将被忽略。
//Routes 类中添加路由的方法有两个:
public Routes add(String controllerKey, Class<? extends Controller> controllerClass, String viewPath)
public Routes add(String controllerKey, Class<? extends Controller> controllerClass)
//第一个参数controllerKey是指访问某个Controller所需要的一个字符串,该字符串唯一对应一个Controller,controllerKey仅能定位到Controller。
//第二个参数controllerClass是该controllerKey所对应到的Controller。
//第三个参数viewPath是指该Controller返回的视图的相对路径。当viewPath未指定时默认值为controllerKey。
从表中可以看出,JFinal访问一个确切的Action(Controller内的方法)需要使用controllerKey与method来精确定位,
当method省略时默认值为index。
urlPara是为了能在url中携带参数值,urlPara可以在一次请求中同时携带多个值,
JFinal默认使用减号“-”来分隔多个值(可通过constants. setUrlParaSeparator(String)设置分隔符),
在Controller中可以通过getPara(int index)分别取出这些值。
controllerKey、method、urlPara这三部分必须使用正斜杠“/”分隔。
注意,controllerKey自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2的namespace功能。
JFinal在以上路由规则之外还提供了ActionKey注解,可以打破原有规则,以下是代码示例:
public class UserController extends Controller {
@ActionKey("/login")
public void login() {
render("login.html");
}
}
假定 UserController 的 controllerKey值为“/user”,
在使用了@ActionKey(“/login”)注解以后,
actionKey由原来的“/user/login”变为了“/login”。
该注解还可以让actionKey中使用减号或数字等字符,如“/user/123-456”。
如果JFinal默认路由规则不能满足需求,开发者还可以根据需要使用Handler定制更加个性化的路由,大体思路就是在Handler中改变第一个参数String target的值。
JFinal路由还可以进行拆分配置,这对大规模团队开发十分有用,以下是代码示例:
public class FrontRoutes extends Routes {
public void config() {
setBaseViewPath("/view/front");
add("/", IndexController.class);
add("/blog", BlogController.class);
}
}
public class AdminRoutes extends Routes {
public void config() {
setBaseViewPath("/view/admin");
addInterceptor(new AdminInterceptor());
add("/admin", AdminController.class);
add("/admin/user", UserController.class);
}
}
public class MyJFinalConfig extends JFinalConfig {
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) {}
}
FrontRoutes类中配置了系统前端路由,
AdminRoutes配置了系统后端路由,
MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。
使用这种拆分配置不仅可以让MyJFinalConfig文件更简洁,
而且有利于大规模团队开发,避免多人同时修改MyJFinalConfig时的版本冲突。
FrontRoutes与AdminRoutes中分别使用setBaseViewPath(…)
设置了各自Controller.render(view)时使用的baseViewPath。
AdminRoutes 还通过addInterceptor(new AdminInterceptor())添加了 Routes 级别的拦截器,
该拦截器将拦截 AdminRoutes 中添加的所有 Controller,
相当于业务层的inject拦截器,会在class拦截器之前被调用。
这种用法可以避免在后台管理这样的模块中的所有class上使用
@Before(AdminInterceptor.class),减少代码冗余。
3.configEngine(..)此方法用来配置Template Engine
public void configEngine(Engine me) {
me.addSharedFunction("/view/common/layout.html");
me.addSharedFunction("/view/common/paginate.html");
me.addSharedFunction("/view/admin/common/layout.html");
}
上面的方法向模板引擎中添加了三个定义了 template function 的模板文件
4. configPlugin(..) 此方法用来配置JFinal的Plugin(插件),JFinal插件架构是其主要扩展方式之一,可以方便地创建插件并应用到项目中去。
ublic void configPlugin(Plugins me) {
DruidPlugin dp = new DruidPlugin(jdbcUrl, userName, password);
me.add(dp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
arp.addMapping("user", User.class);
me.add(arp);
}
如下代码配置了Druid数据库连接池插件
与ActiveRecord数据库访问插件。
通过以下的配置,可以在应用中使用ActiveRecord非常方便地操作数据库。
5. configInterceptor(..) 此方法用来配置JFinal的全局拦截器,全局拦截器将拦截所有 action 请求,除非使用@Clear在Controller中清除
public void configInterceptor(Interceptors me) {
me.add(new AuthInterceptor());
}
全局拦截器将拦截所有 action 请求,除非使用@Clear在Controller中清除,
如下代码配置了名为AuthInterceptor的拦截器。
JFinal 的 Interceptor 非常类似于 Struts2,但使用起来更方便,
Interceptor 配置粒度分为 Global、Inject、Class、Method四个层次,
其中以上代码配置粒度为全局。
Inject、Class与Method级的Interceptor配置将在后续章节中详细介绍。
6.configHandler(..) 此方法用来配置JFinal的Handler
public void configHandler(Handlers me) {
me.add(new ResourceHandler());
}
如下代码配置了名为ResourceHandler的处理器,
Handler可以接管所有web请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。
7.回调方法配置
在 JFinalConfig 继承类中可以添加 afterJFinalStart() 与 beforeJFinalStop(),JFinal 会在系统启动完成之后以及系统关闭之前分别回调这两个方法:
// 系统启动完成后回调
public void afterJFinalStart() {
}
// 系统关闭之前回调
public void beforeJFinalStop() {
}
在 JFinalConfig 继承类中可以添加 afterJFinalStart() 与 beforeJFinalStop(),
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");
如下是在项目中具体的使用示例: