在来一发关于3.0模板引擎的问题

@JFinal -问题:

1、我扩展了自定义指令#test()

2、这个指令存在了数据库中,比如某篇文章内容中

3、页面输出这篇文章(也夹带了这个指令)

那么问题来了,这个指令不被解析,直接输出了指令源码,请问怎么处理下~~

评论区

JFinal

2017-04-05 16:01

扩展的指令通过 engine.addDirective 方法添加进去了没?

要输就输给追求

2017-04-05 16:08

。。。。存数据库的东西只会当成普通字符处理。

quiet_cai

2017-04-05 17:10

@JFinal 添加了~~

quiet_cai

2017-04-05 17:25

@JFinal 大概意思就是解析指令的时候与数据输出没有直接关系了,可能执行的顺序影响解析过程了,需要特殊处理?或者针对性的二次解析?

JFinal

2017-04-05 17:30

@quiet_cai 你的数据内容存放在了数据库中,而这部分内容并不是模板的一部分,只是模板中的一个变量而已,自然就不会被解析了

JFinal

2017-04-05 17:32

@quiet_cai 道理很简单,将这种用法用在 jsp、freemarker、velocity 等等任意的一款模板都是一样的结果,例如在数据库中存放一个 ${value} 数据,然后在 jsp 中使用一样会原样输出,不会被解析

quiet_cai

2017-04-05 17:53

@JFinal 道理明白,我的意思可以怎么解决这个问题

goodjfinalx

2017-04-05 19:40

我也遇到类似的问题,没办法,我只好把数据库中的模板拿出来,单独#define,这样就搞定了!

JFinal

2017-04-05 20:16

@goodjfinalx @quiet_cai 解决办法极其简单,扩展出一个 Eval 指令出来,大致这样:
public class Eval extends Directive {
public void exec(Env env, Scope scope, Writer) {
String content = exrpList.eval(scope);
String result = Engine.use().getTemplateByString(content).renderToString(new HashMap());
write(wirter, result);
}
}

做好以后添加: me.addDirective("eval", new Eval());
用的时候这样:#eval(article.content)

jfinal 3.0 在发布前曾想做这样一个指令,但由于担心 eval 会被人误用带来一定的安全隐患,这个功能暂且留给开发者自己去扩展着玩

如果要做得更好,可以创建 Parser 对内容进行解析得到 ast 以后执行,连 Engine.use() 都不再需要了

quiet_cai

2017-04-05 21:20

@JFinal 问题以解决,思路一样,大概就是先get回来模板,连着数据一起renderToString一下,然后拿着返回的html字符串在render一次,最终输出html文档就可以了,不过没你这个优雅~~~thx~~回头优化下
附上代码供参考:
String html = engine.getTemplate("/WEB-INF/view/"+view).renderToString(tempData);
renderHtml(engine.getTemplateByString(html).renderToString(tempData));

JFinal

2017-04-06 10:38

@quiet_cai jfinal template engine 扩展起来就是这么简洁强大,指令级的扩展是 jfinal 独创的,世面上找不到第二家

热门反馈

扫码入社