StringTemplate和FreeMarker之间的主要区别是什么?

32

网络上似乎充满了Velocity和FreeMarker之间的比较,它们看起来相当相似。但是似乎几乎没有StringTemplate和FreeMarker之间的比较!

那么,StringTemplate和FreeMarker的主要区别是什么?

我的使用只限于生成HTML页面。在这两个模板引擎中,我本以为FreeMarker更适合并且更强大,因为它似乎更常见 - 但是通过快速浏览,StringTemplate实际上具有更合适的功能!

如果有用过这两款引擎的人有时间评论一下就太好了 - 对于实际细节,我可以并排阅读文档,但我想先做一些初步了解。


1
一个快速的澄清!我不感兴趣的是显而易见的区别——StringTemplate是功能性的,没有循环等,而FreeMarker几乎是一个完整的编程语言!我感兴趣的是在使用过程中出现的具体特性差异——其中一件事在一种工具中很容易实现,但在另一种工具中却非常困难。 - Nakedible
2个回答

39

我设计ST是为了在厌倦JSP中的“模板中编码”模式之后构建jGuru。 Velocity等工具(即我认为的每个其他引擎)提供了比您需要的更多的功能。 我仅使用了基本的四个功能来构建jGuru.com(如文章中所述)。 更多的功能是不必要的,并且会导致将数据模型与模板混为一谈。 如果您正在构建单个原型,则可以使用任何引擎,这种情况下在模板中编码是可以接受的,因为您不关心维护。

另一个人们似乎忽视的事情是:美工怎么能读懂模板中的代码? 他们不行。 那么,他们该如何在模板上工作呢? 即使更改某些元素的顺序也可能破坏您的模型。 在商业环境中,您确实需要分离才能工作,除非您希望网站看起来像是程序员构建的HTML ;)


4
你对ST了解不够,所以不应该发表评论!;-) 但说真的,我更关注于其他功能,而不仅仅是模型-视图分离。像模板继承这样的东西,在ST中有,但在FM中没有,至少不是同样的方式。似乎很奇怪,当比较FreeMarker、Velocity甚至XSLT时,没有人考虑到StringTemplate。 - Nakedible
嗨。是的,继承对于避免重复模板非常关键。我在ANTLR代码生成中广泛使用它。我有基本的Java模板来生成解析器。如果你想要树,我必须注入树构造代码而不重复整个Java组。如果你打开-debug,我需要注入调试事件触发器。有时两者都需要!继承让你描述纯Java输出和带有调试/树操作的Java输出之间的差异。 - Terence Parr
3
继承是让ST变得诱人的东西!否则,我不喜欢过于严格的MVC,因为我们没有那些无法抵制MVC变化并且无法理解非常简单VTL的神话图形设计师。 - Nathan Bubna
然而,在Servlet环境中推荐使用StringTemplate是困难的,因为它不是线程安全的,也没有任何公开承诺使其成为线程安全的(https://github.com/antlr/stringtemplate4/issues/61)。 - David Bullock

10
主要的区别在于StringTemplate严格执行模型-视图分离,而您不能在模板中放置逻辑,而FreeMarker允许您在模板中放置完整的逻辑。这至少在开始时使其更难使用,但它更具可扩展性。例如,如果您正在生成代码并且模板中没有逻辑,则在为另一种语言生成另一个端口时,不必在每个模板中复制逻辑,这样就会更少繁琐。
Terence Parr有一篇论文解释了模型-视图分离的好处:https://www.cs.usfca.edu/~parrt/papers/mvc.templates.pdf

1
谢谢,但请阅读我对问题的澄清 - 答案并没有告诉我任何我不知道的东西。 - Nakedible
1
论文链接现在已经失效。 - Akshay Ransing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接