6.2 引擎配置

    2、配置多个 Engine 对象

    由于 Enjoy 引擎被设计为多种用途,同一个项目中的不同模块可以使用不同的 Engine 对象,分别用于不同的用途,那么则需要分别配置,各个 engine 对象的配置彼此独立互不干扰。

    例如 jfinal 中的 Controller.render(String) 以及 SQL 管理功能 Db.getSqlPara(…) 就分别使用了两个不同的 Engine 对象,所以这两个对象需要独立配置,并且配置的地点是完全不同的。

    应用于 Controller.render(String) 的 Engine 对象的配置在 configEngine(Engine me) 中进行:

    1. public void configEngine(Engine me) {
    2. // devMode 配置为 true,将支持模板实时热加载
    3. me.setDevMode(true);
    4. }

    应用于 SQL 管理的 Engine 对象的配置在 configPlugin(Plugins me) 中进行:

    1. public void configPlugin(Plugins me) {
    2. ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
    3. Engine engine = arp.getEngine();
    4.  
    5. engine.setToClassPathSourceFactory();
    6. engine.addSharedMethod(new StrKit());
    7.  
    8. me.add(arp);
    9. }

    常见错误:经常有同学在配置 SQL 管理的 Engine 对象时,是在 configEngine(Engine me) 中进行配置,造成配置错配的问题。

    同理,自己创建出来的 Engine 对象也需要独立配置:

    1. // 创建一个 Engine 对象并进行配置
    2. Engine forEmail = Engine.create("forEmail");
    3. forEmail.addSharedMethod(EmailKit.class);
    4. forEmail.addSharedFunction("email-function.txt");
    5.  
    6. // 创建另一个 Engine 对象并进行配置
    7. Engine forWeixin = Engine.create("forWeixin");
    8. forWeixin.addSharedMethod(WeixinKit.class);
    9. forWeixin.addSharedFunction("weixin-function.txt");

    上面代码创建了两个 Engine 对象,并分别取名为 "forEmail" 与 "forWeixin",随后就可以分别使用这两个 Engine 对象了:

    1. // 使用名为 "forEmail" 的 engine 对象
    2. System.out.print(ret);
    3.  
    4. // 使用名为 "forWeixin" 的 engine 对象
    5. String ret = Engine.use("forWeixin").getTemplate("weixin-template.txt").renderToString(...);
    6. System.out.print(ret);

    如上代码所示,通过 Engine.use(…) 方法可以获取到 Engine.create(…) 创建的对象,既很方便独立配置,也很方便独立获取使用。

    4、模板热加载配置

    为了达到最高性能 Enjoy 引擎默认对模板解析结果进行缓存,所以模板被加载之后的修改不会生效,如果需要实时生效需要如下配置:

    配置成 devMode 模式,开发环境下是提升开发效率必须的配置。

    由于 Enjoy 的模板解析速度是 freemarker、velocity 这类模板引擎的 7 倍左右,并且模板解析前也会判断是否被修改,所以绝大部分情况下建议配置成热加载模式:setDevMode(true),除非你的项目是极端高性能的应用场景。

    如果模板中通过 #define 指令定义了 template function,并且希望这些 template function 可以在其它模板中直接调用的话,可以进行如下配置:

    1. // 添加共享函数,随后可在任意地方调用这些共享函数
    2. me.addSharedFunction("/view/common/layout.html");

    6、从 class path 和 jar 包加载模板配置

    如果模板文件在项目的 class path 路径或者 jar 包之内(注意:maven 项目的 src/main/resources 也属于 class path),可以通过me.setToClassPathSourceFactory() 以及 me.setBaseTemplatePath(null) 来实现,以下是代码示例:

    1. public void configEngine(Engine me) {
    2. me.setDevMode(true);
    3.  
    4. me.setBaseTemplatePath(null);
    5. me.setToClassPathSourceFactory();
    6.  
    7. me.addSharedFunction("/view/common/layout.html");
    8. }

    Enjoy 引擎默认提供了 FileSourceFactory、与 ClassPathSourceFactory 来配置模板加载来源的策略,前者从文件系统中加载模板,后者从 class path 以及 jar 包加载模板。其中前者是默认配置,后者可通过 engine.setToClassPathSourceFactory() 进行配置。

    还可以通过实现 ISourceFactory 接口,扩展出从任意来源加载模板的策略。然后通过 engine.setSourceFactory(…) 切换到自己扩展的策略上去。

    还可以通过实现 ISource 接口,然后通过 engine.get(new MySource(…)) 去加载模板内容。目前已有用户实现 DbSource 从数据库加载模板的功能。

    在 Eclipse 下开发时,可以将 Validation 配置中的 Html Syntax Validator 中的自动验证去除勾选,因为 eclipse 无法识别 Enjoy 使用的指令,从而会在指令下方显示黄色波浪线影响美观。具体的配置方式见下图: