開篇 概述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(…)將緩存的內容進行清除。