JFinal的Enjoy模板可以很好的实现前端页面中的各功能模块的分离,如header,menu,left,bottom,navigation,contain等都可以分离到一个个单独的页面中,再通过Enjoy的模板函数来实现自动整合。
除了可以对相对单独的页面进行分离,对某些动态内容也可以通过Enjoy的模板函数来实现分离与整合,让我们的前端页面各功能各按其责,而不是混在一起,难以维护。
模板页面中调用模板函数也支持安全调用,如 #@name?(p1, p2…, pn),即使这个name函数不存在也不会出错。但有时需要明确的判断在页面中是否定义了这个模板函数,如下面的场景:
<div class="page-header">#@header?()</div>
如果在页面中没定义header()函数,上述写法也不会报错,但执行完的html中就会变成 <div class="page-header"></div>,自动多了个<div></div>出来,如果想当header()函数不存在时不显示这个<div></div>,则需要在页面中明确判断是否存在这个header()函数,由于现在jfinal还没有实现这个方法,在波总的开发群中得到支持,此处需要用到自定义前端指令,用于判断是否在页面中定义了这个函数。
开发步骤:
1:编写自定义前端指令class类:
package com.cz.utils; import com.jfinal.template.Directive; import com.jfinal.template.Env; import com.jfinal.template.io.Writer; import com.jfinal.template.stat.Scope; public class IfDefFuncDirective extends Directive { public void exec(Env env, Scope scope, Writer writer) { Object funcName = exprList.eval(scope); if (funcName != null && env.getFunction(funcName.toString()) != null) { stat.exec(env, scope, writer); } } public boolean hasEnd() { return true; } }
2:AppConfig.java启动类中配置该自定义指令:
public void configEngine(Engine me) { me.setDevMode(p.getBoolean("engineDevMode", false)); me.addDirective("ifDefFunc", IfDefFuncDirective.class); ...... }
3:前端引用:
#ifDefFunc('header') <div class="page-header">#@header?()</div> #end
ps:JFinal 俱乐部真挺不错,会员非常活跃,有问必答,物超所值。