需求:在还没有给模板填充数据的时候,可以看到模板展示设计效果
1、定义else块,其实else块也是一个扩展指令,暂且定义为default,
public class DefaultDirective extends Directive {}
2、实现扩展指令
public class DemoDirective extends Directive { //在default指令之前的指令集合 private List<Stat> beforeDefaultStat = new ArrayList<Stat>(); //在default指令之后的指令集合 private List<Stat> afterDefaultStat = new ArrayList<Stat>(); //根据default指令解析 public void parseDefault() { if(stat instanceof StatList) { boolean flag = true; StatList statList = (StatList)stat; for(int i=0; i<statList.length(); i++) { Stat temp = statList.getStat(i); if(temp instanceof DefaultDirective) { flag = false; } if(flag) { beforeDefaultStat.add(temp); } else { afterDefaultStat.add(temp); } } } } //执行在default指令之前的指令 public void execBeforeDefault(Env env, Scope scope, Writer writer) { setStat(new StatList(beforeDefaultStat)); stat.exec(env, scope, writer); } //执行在default指令之后的指令 public void execAfterDefault(Env env, Scope scope, Writer writer) { setStat(new StatList(afterDefaultStat)); stat.exec(env, scope, writer); } @Override public void exec(Env env, Scope scope, Writer writer) { parseDefault(); List list = Service.me.getList();//获取数据 if(null == list || list.isEmpty()) { execAfterDefault(env, scope, writer); return; } for(Object x : list) { scope.set("x", x); execBeforeDefault(env, scope, writer); } } @Override public boolean hasEnd() { return true; } }
3、不要忘记在模板引擎中添加扩展指令
engine.addDirective("default", new DefaultDirective()); engine.addDirective("demo", new DemoDirective());
4、模板中使用
#demo() 在default指令之前 #default() 在default指令之后 #end
结束!
###实现完以后,突然觉得没有必要,扩展指令没必要这么复杂,单纯点也许更好,只作为数据传递层就行,可以配合Engine模板内置指令也能达到这种效果。###
#demo 指令中还可以传入参数,用来控制显示哪部分数据