开篇 概述html
基于JFinal的web项目须要建立一个继承自JFinalConfig类的子类,该类用于对整个web项目进行配置。前端
JFinalConfig子类须要实现六个抽象方法,以下所示:web
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) {} }
详解redis
1.configConstant(..)数据库
此方法用来配置JFinal常量值,如开发模式常量devMode的配置,以下代码配置了JFinal运行在开发模式后端
public void configConstant(Constants me) { //开发者模式 me.setDevMode(true); }
在开发模式下,JFinal会对每次请求输出报告,如输出本次请求的URL、Controller、Method以及请求所携带的参数。缓存
2.configRoute(..)架构
此方法用来配置访问路由,以下代码配置了将 "/hello" 映射到HelloController这个控制器,经过如下的配置,http://localhost/hello 将访问 HelloController.index() 方法,而http://localhost/hello/methodName 将访问到 HelloController.methodName() 方法。app
public void configRoute(Routes me) { me.setBaseViewPath("/view"); me.addInterceptor(new FrontInterceptor()); me.add("/hello", HelloController.class); }
Routes.setBaseViewPath(baseViewPath)方法用于为该Routes 内部的全部Controller设置视图渲染时的基础路径,该基础路径与Routes.add(…, viewPath)方法传入的viewPath以及 Controller.render(view) 方法传入的 view 参数联合组成最终的视图路径,规则以下:less
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返回的视图的相对路径(该参数具体细节将在Controller相关章节中给出)。当viewPath未指定时默认值为controllerKey。
JFinal路由规则以下表:
从表中能够看出,JFinal访问一个确切的Action(Action定义见3.2节)须要使用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,以下代码配置了Druid数据库链接池插件与ActiveRecord数据库访问插件。经过如下的配置,能够在应用中使用ActiveRecord很是方便地操做数据库。
public 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); }
JFinal插件架构是其主要扩展方式之一,能够方便地建立插件并应用到项目中去。
5.configInterceptor(..)
此方法用来配置JFinal的全局拦截器,全局拦截器将拦截全部 action 请求,除非使用@Clear在Controller中清除,以下代码配置了名为AuthInterceptor的拦截器。
public void configInterceptor(Interceptors me) { me.add(new AuthInterceptor()); }
JFinal 的 Interceptor 很是相似于 Struts2,但使用起来更方便,Interceptor 配置粒度分为 Global、Inject、Class、Method四个层次,其中以上代码配置粒度为全局。Inject、Class与Method级的Interceptor配置将在后续章节中详细介绍。
6.configHandler(..)
此方法用来配置JFinal的Handler,以下代码配置了名为ResourceHandler的处理器,Handler能够接管全部web请求,并对应用拥有彻底的控制权,能够很方便地实现更高层的功能性扩展。
public void configHandler(Handlers me) { me.add(new ResourceHandler()); }
7.回调方法配置
在 JFinalConfig 继承类中能够添加 afterJFinalStart() 与 beforeJFinalStop(),JFinal 会在系统启动完成以后以及系统关闭以前分别回调这两个方法:
// 系统启动完成后回调 public void afterJFinalStart() { } // 系统关闭以前回调 public void beforeJFinalStop() { }
这两个方法能够很方便地在项目启动后与关闭前让开发者有机会进行额外操做,如在系统启动后建立调度线程或在系统关闭前写回缓存 或 处理垃圾回收。
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(…)将缓存的内容进行清除。