天天看點

JFinal 3.3 學習 -- JFinalConfig (配置web項目)

開篇  概述

基于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會對每次請求輸出報告,如輸出本次請求的URL、Controller、Method以及請求所攜帶的參數。

2.configRoute(..)

  此方法用來配置通路路由,如下代碼配置了将 "/hello" 映射到HelloController這個控制器,通過以下的配置,http://localhost/hello  将通路 HelloController.index() 方法,而http://localhost/hello/methodName  将通路到 HelloController.methodName() 方法。

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 參數聯合組成最終的視圖路徑,規則如下:

  

  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 3.3 學習 -- JFinalConfig (配置web項目)

  從表中可以看出,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-[email protected]
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(…)将緩存的内容進行清除。 

轉載于:https://www.cnblogs.com/lsy131479/p/8918505.html