实现扩展指令中的else块

需求:在还没有给模板填充数据的时候,可以看到模板展示设计效果

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模板内置指令也能达到这种效果。###

评论区

JFinal

2017-11-02 11:02

想法非常有创意,感谢你的分享

#demo 指令中还可以传入参数,用来控制显示哪部分数据

热门分享

扫码入社