选择正确的模板引擎

时间:2010-01-17 19:43:52

标签: java templates frameworks

从今天开始 - 我总是使用简单的JSP标签和JSTL,但现在我正在寻找更多的功能和更多的可用性。

通过谷歌搜索,我发现Freemaker,Velocity和Tiles似乎非常有名。你们中的某些人是否对这些方面有一些进一步的经验,可以给我一个简短的介绍。

还是有其他值得研究的框架吗?

4 个答案:

答案 0 :(得分:7)

在我看来,使用模板引擎,少就是更多。也就是说,您需要更少的功能,而不是更多功能,以促进模板的可重用性。

一个模板引擎,仅提供模板引擎严格需要的功能,而不再是StringTemplate。这不是我个人在生产系统中使用的东西,而是我计划下一次获得的机会。

如果您有兴趣了解有关该主题/哲学的更多信息,请阅读StringTemplate创建者的Enforcing Strict Model-View Separation in Templating Engines

如果您只阅读该论文中的一个部分,请阅读第7章,其中包括我尝试强制执行的以下规则(即使使用类似JSP的东西,可以说是“太强大”的引擎):

  
      
  1. 视图无法通过直接更改模型来修改模型   数据对象或通过调用方法   引起副作用的模型。   也就是说,模板可以访问数据   从模型和调用方法,但   这些参考必须是副作用   自由。这个规则部分产生   因为数据引用必须是   为了不敏感。见7.1节。
  2.   
  3. 视图无法对依赖数据执行计算   值因为计算可能   改变未来,他们应该   整齐地封装在模型中   任何情况。例如,视图不能   计算书籍销售价格为   “$价格* 0.90”。独立于   模型,视图无法制作   关于数据含义的假设。
  4.   
  5. 视图无法比较相关数据值,但可以测试   数据的属性,如   是否存在或长度   多值数据值。测试就像   $ bloodPressure< 120必须转移到   医生喜欢保留的模型   降低最大收缩压   在我们身上视图中的表达式必须是   替换为a的存在测试   模拟布尔值的值   $ bloodPressureOk!= null模板输出   可以以模型数据和条件为条件   计算,有条件的   必须在模型中计算。甚至   做出负值的简单测试   红色应该在模型中计算;   正确的抽象级别是usu-   某种更高层次的盟友   “部门x正在赔钱。”
  6.   
  7. 视图无法进行数据类型假设。某些类型的假设是   当视图假设数据时显而易见   例如,value是一个日期,但更多   细微类型的假设:如果a   模板假设$ userID是   整数,程序员不能   将此值更改为非数字值   在模型中没有打破   模板。此规则禁止数组   索引,如colorCode [$ topic]和   $ name [$ ID]视图进一步不能   调用带有参数的方法   (静态或动态)有   假定的论证类型,除非一个   可以保证模型方法   仅将它们视为对象。   除了图形设计师不是   程序员;期待他们调用   方法,知道要传递的是什么   不现实的。
  8.   
  9. 模型中的数据不得包含显示或布局信息。   模型无法通过任何显示   伪装成视图的信息   数据值。这包括不通过   要应用的模板的名称   其他数据值。
  10.   

答案 1 :(得分:3)

  • Velocity是java模板引擎的老头,它显示了它。设计有点硬(很多静态方法),而且有点限制,不太可扩展。不过,它的效果非常好,integrates well with Spring MVC
  • Freemarker开始在Velocity离开的地方。它有更多的功能,它是非常可扩展的,它与Spring MVC非常完美地集成在一起。在缺点方面,我发现模板表达语言非常奇特。
  • Tiles我没有经验,虽然与Struts有任何关联让我怀疑。

在视图渲染方面,我仍然使用JSP和JSTL。对于他们所有的缺陷,我认为他们仍然提供最好的选择范围。

当谈到在Web层范围之外呈现动态文本文档时(例如短信或电子邮件模板),Freemarker会为我赢得胜利。

答案 2 :(得分:2)

如果您喜欢Scala编程语言,可能需要使用Scalate,因为它允许您使用强大的Scala表达式而不是有限的JSP / JSF / JSTL EL表达式语言 - 同时完全静态类型化在编辑/编译时检查模板是否有错误。

Scalate中的Scaml模板让您可以编写特别适合XML / HTML的DRY模板(Rails粉丝喜欢Haml和Scaml是Haml的Scala端口) - 尽管您已经习惯了从使用类似JSP的Scalate中的Ssp模板开始,你可能会更好。

答案 3 :(得分:1)

我和Spring {{}共同使用VelocityFreeMarker。尽管Velocity非常轻巧且易于使用,但它在某种程度上受到限制。由于大型现有宏库和JSP包含支持,我更喜欢FreeMarker进行网页呈现。

我还建议SiteMesh进行网页修饰,以避免模板文件将内容与装饰混合在一起。

所以,如果你不需要AJAX页面的幻想,结果是:Freemarker + SiteMesh + Spring MVC。但如果您想知道是否使用AJAX,我建议您查看GWT showcase