Jfinal---JFinalConfig解析

1.概述
基於 JFinal 的 web 項目需要創建一個繼承自 JFinalConfig 類的子類,該類用於對整個 web
項目進行配置。
JFinalConfig 子類需要實現五個抽象方法,如下所示:

public class DemoConfigextends JFinalConfig{ 

    publicvoid configConstant(Constants me){} 

    public void configRoute(Routesme) {}

    publicvoid configPlugin(Plugins me) {}

    public void configInterceptor(Interceptors me) {}

    public void configHandler(Handlersme) {}

}

2.2 configConstant(Constants me)

此方法用來配置 JFinal 常量值,
如開發模式常量 devMode 的配置,默認視圖類型 ViewType的配置

public void configConstant(Constants me) {
        //設置開發模式爲true
        me.setDevMode(true);

        //設置默認視圖類型爲jsp
        me.setViewType(ViewType.JSP);

        // 加載少量必要配置,隨後可用getProperty(...)獲取值
        loadPropertyFile("a_little_config.txt");

        me.setMaxPostSize(2000000000);
    }

在開發模式下,JFinal 會對每次請求輸出報告,如輸出本次請求的 Controller、Method 以 及請求所攜帶的參數。JFinal 支持 JSP、FreeMarker、Velocity 三種常用視圖。

2.3 configRoute(Routes me)

此方法用來配置 JFinal 訪問路由,一般爲了方便管理,會拆分一下

public void configRoute(Routes me) {
        // 前端路由,創建AdRoutes類管理
        me.add(new AdRoutes()); 
        //直接添加
        me.add("/hello", HelloController.class);
    }

Routes 類主要有如下兩個方法:

public Routes add(String controllerKey, Class<? extends Controller>
controllerClass, String viewPath)

public Routes add(String controllerKey, Class<? extends Controller>
    controllerClass) 
//路由管理類
public class AdRoutes extends Routes{
    @Override 
    public void config() {
        //對應路由信息
        add("/admin", AdminController.class);
        add("/dsp", DspController.class);
        add("/multiios", MultiIosController.class);
        add("/lucky", LuckyController.class);
        add("/onlineGame", OnlineGameController.class);
        add("/wifiNews", WifiNewsController.class);
    }
}

JFinal 路由規則如下表:
JFinal 路由規則

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 路由還可以進行拆分配置,這對大規模團隊開發特別有用,以下是代碼示例:

//前端路由
public class FrontRoutes extends Routes {
    public void config(){
        add("/",IndexController.class);
        add("/blog", BlogController.class);
    }
}
//後端路由
public class AdminRoutesextends Routes{
    public void config(){
    add("/admin",AdminController.class);
    add("/admin/user", UserController.class);
    }
}
public class MyJFinalConfigextends JFinalConfig{

    publicvoid configRoute(Routesme) { 
        me.add(new FrontRoutes());  // 前端路由 
        me.add(new AdminRoutes()); // 後端路由
    }

    public void configConstant(Constantsme) {}
    public void configPlugin(Pluginsme) {}
    public void configInterceptor(Interceptorsme) {}
    public void configHandler(Handlersme) {}
}

如上三段代碼,FrontRoutes 類中配置了系統前端路由,AdminRoutes 配置了系統後端路由, MyJFinalConfig.configRoute(…)方法將拆分後的這兩個路由合併起來。使用這種拆分配置不僅 可以讓 MyJFinalConfig 文件更簡潔, 而且有利於大規模團隊開發, 避免多人同時修改 MyJFinalConfig 時的版本衝突。


如果 JFinal 默認路由規則不能滿足需求,開發者還可以根據需要使用 Handler 定製更加個 性化的路由,大體思路就是在 Handler 中改變第一個參數 String target 的值。

2.4 configPlugin (Plugins me)

此方法用來配置 JFinal 的 Plugin,如下代碼配置了 C3p0 數據庫連接池插件與 ActiveRecord數據庫訪問插件。通過以下的配置,可以在應用中使用 ActiveRecord 非常方便地操作數據庫。

public void configPlugin(Pluginsme){ 
    //加載配置文件
    loadPropertyFile("your_app_config.txt");

    //c3p0連接,可創建多個不同連接,連接不同數據庫
    C3p0Plugin c3p0Plugin = 
    new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password"));
    me.add(c3p0Plugin);

    // 配置ActiveRecord插件,不指定configName
    ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin);
    //指定configName
    ActiveRecordPlugin arp = new ActiveRecordPlugin("configName",c3p0Plugin);
    me.add(arp);

    // 方式一: 直接配置數據表映射
    //參數(String tableName, String primaryKey, Class<? extends Model<?>> modelClass)                 
    arp.addMapping("user", "id", User.class);
    //(String tableName, Class<? extends Model<?>> modelClass)
    arp.addMapping("user",User.class);

   // 方式二:配置數據表映射寫到一個文件中
   // DbMappingKit.mapping(arp);


    //redis插件
    //(String cacheName, String host, int port, int timeout, String password)
    RedisPlugin yunyingRedis = 
            new RedisPlugin("yunying", "120.26.234.218",7779,5000,"Y1z+yYGhQ1z8xI8f");
    me.add(yunyingRedis);

    //memcahe插件
    //(String host, int port)
    MemcachedPlugin newsMemcached = new MemcachedPlugin("127.0.0.1", 11211);
    me.add(newsMemcached);

數據庫映射的第二種方式:映射表的文件DbMappingKit

public class DbMappingKit {
    public static void mapping(ActiveRecordPlugin arp) {
        arp.addMapping("user", "id", User.class);
    }
}

2.5 configInterceptor (Interceptors me)
此方法用來配置 JFinal 的全局攔截器,全局攔截器將攔截所有 action 請求,除非使用@Clear 在 Controller 中清除,如下代碼配置了名爲 AuthInterceptor 的攔截器。

public void configInterceptor(Interceptorsme){ 
     me.add(new AuthInterceptor());
}

JFinal 的 Interceptor 非常類似於 Struts2,但使用起來更方便,Interceptor 配置粒度分爲 Global、Class、Method 三個層次,其中以上代碼配置粒度爲全局。

攔截器有三種配置級別:
    1)全局攔截器:在JFinalConfig實現類的public void configInterceptor(Interceptors me)方法裏添加攔截器,對所有的Controller有效;
    2)Controller攔截器:通過@Before(StudentInterceptor.class)註釋在類的最頂部,只對這個Controller有效;
    3)Action攔截器:通過@Before(StudentValidator.class)註釋在對應的action方法體上,請求該action時會先經過攔截器處理。

注意:如果需要通過註解的方式配置多個攔截器可以如下方式:
    @Before({StudentValidator.class, StudentValidator.class})
ps:
    如果已經配置了攔截器但是又想在某個action中清除掉攔截器,可以通過註解:@ClearInterceptor(ClearLayer.ALL)清除所有的攔截器,如果沒寫括號參數,默認清除上一級的。
1)action清除上一級爲controller級;
2)controller級別爲全局級。

2.6 configHandler (Handlers me)

此方法用來配置 JFinal 的 Handler,如下代碼配置了名爲 ResourceHandler 的處理器,Handler 可以接管所有 web 請求,並對應用擁有完全的控制權,可以很方便地實現更高層的功能性擴 展。

(具體使用場景未知)

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

2.7 afterJFinalStart()與 beforeJFinalStop()

JFinalConfig 中的 afterJFinalStart()與 beforeJFinalStop()方法供開發者在 JFinalConfig 繼承類中 覆蓋 。 JFinal 會在系統啓動完成後回調 afterJFinalStart() 方 法 , 會 在 系 統 關 閉 前 回 調 beforeJFinalStop()方法。這兩個方法可以很方便地在項目啓動後與關閉前讓開發者有機會進行 額外操作,如在系統啓動後創建調度線程或在系統關閉前寫回緩存。

2.8 PropKit

PropKit 工具類用來操作外部配置文件。PropKit 可以極度方便地在系統任意時空使用,如 下是示例代碼:

public class AppConfigextends JFinalConfig{

    public void configConstant(Constantsme) {
        // 第一次使用use加載的配置將成爲主配置,可以通過PropKit.get(...)直接取值 
        PropKit.use("a_little_config.txt");
        me.setDevMode(PropKit.getBoolean("devMode"));
    }

    public void configPlugin(Pluginsme) {
        // 非第一次使用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 中,可以在項目的任何地方使用, JFinalConfig 的 getProperty 方法其底層依賴於 PropKit 實現。

以上都是自己在學習過程中的總結整理,如果有錯誤的地方,歡迎留言指正。

發佈了27 篇原創文章 · 獲贊 33 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章