需求:在还没有给模板填充数据的时候,可以看到模板展示设计效果
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 指令中还可以传入参数,用来控制显示哪部分数据