beetl模板引擎自定义交流。

beetl官网文档,

3.15. 定制输出占位符输出允许定制。如所有日期类型都按照某个格式化输出,而不需显式的使用格式化输出,或者为了防止跨脚本站点攻击,需要对类型为String的值做检查等,不必使用格式化函数,可以直接对占位符输出进行定制,代码如下PlaceholderST.output = new PlaceholderST.Output(){ @Override public void write(Context ctx, Object value) throws IOException { //定制输出 ctx.byteWriter.writeString("ok"+value!=null?value.toString:""); }};


//查阅代码发现 

FastRuntimeEngine 这个类是jfinal集成beetl时使用的模板引擎。
然后自定义加入下面代码,最终发现缺少类。


public class MyRuntimeEngine extends FastRuntimeEngine {


    @Override
    public Program createProgram(Resource rs, Reader reader, Map<Integer, String> textMap, String cr, GroupTemplate gt) {
        Program program =  super.createProgram(rs, reader, textMap, cr, gt);
        return program;
    }

    private void modifyStatemetn(Resource resource,Program program,GroupTemplate gt){
        Statement[] sts = program.metaData.statements;
        //这里报没有这个类
        StatementParser parser = new StatementParser(sts, gt, resource.getId());
        parser.addListener(PlaceholderST.class, new PlaceholderSTListener());

        parser.parse();
    }

}

想在 jfinal 里订制自己的模板引擎,具体需要怎样弄。有谁弄过,欢迎交流。


评论区

jf大哥大

2019-09-19 16:56

自己顶一个

要输就输给追求

2019-09-19 17:10

这是自定义指令啊。直接看文档里面关于指令的就行了

jf大哥大

2019-09-19 17:47

@要输就输给追求 贴错代码了,我正在试着改,目前发现少类。

JFinal

2019-09-19 18:10

@jf大哥大 这种功能不叫定制模板引擎,顶多叫功能定制,或者叫扩展

模板引擎是很大且比较复杂的体系,肯定是不能叫所谓的定制的

enjoy 引擎有很多扩展、定制方式,例如,可以定制自己的输出指令:
public class MyOutput extends Output {
.... 这里的代码定制自己的输出指令
}

public class MyOutputDirectiveFactory extends OutputDirectiveFactory {
public Output getOutputDirective(ExprList exprList, Location location) {
return new MyOutput(exprList, location);
}
}

然后再配置一下:
engine.setOutputDirectiveFactory(new MyOutputDirectiveFactory());

然后在用的时候就是在使用自己的输出指令了:
#(...)

理论上来说,这样定制你就可以随心所欲输出自己想输出的模样了,可以进行多种操作,例如输出前先过滤

JFinal

2019-09-19 18:11

如果是要防止跨脚本站点攻击这类,用用 #escape 指令就好,例如:
#escape(blog.content)

jf大哥大

2019-09-19 18:18

@JFinal 要做的和你这个类似,但是不局限与这一类的功能。相当于我要把 beetl 的某些功能内置。 给小白用户普及这些太累,还不如我直接封装。然后真正做到只管写功能,前几天有人用我开源的脚手架。问的问题简直了,恨不得我去给他做一轮培训java基础就好。