从今天开始 - 我总是使用简单的JSP标签和JSTL,但现在我正在寻找更多的功能和更多的可用性。
通过谷歌搜索,我发现Freemaker,Velocity和Tiles似乎非常有名。你们中的某些人是否对这些方面有一些进一步的经验,可以给我一个简短的介绍。
还是有其他值得研究的框架吗?
答案 0 :(得分:7)
在我看来,使用模板引擎,少就是更多。也就是说,您需要更少的功能,而不是更多功能,以促进模板的可重用性。
一个模板引擎,仅提供模板引擎严格需要的功能,而不再是StringTemplate。这不是我个人在生产系统中使用的东西,而是我计划下一次获得的机会。
如果您有兴趣了解有关该主题/哲学的更多信息,请阅读StringTemplate创建者的Enforcing Strict Model-View Separation in Templating Engines。
如果您只阅读该论文中的一个部分,请阅读第7章,其中包括我尝试强制执行的以下规则(即使使用类似JSP的东西,可以说是“太强大”的引擎):
- 视图无法通过直接更改模型来修改模型 数据对象或通过调用方法 引起副作用的模型。 也就是说,模板可以访问数据 从模型和调用方法,但 这些参考必须是副作用 自由。这个规则部分产生 因为数据引用必须是 为了不敏感。见7.1节。
- 视图无法对依赖数据执行计算 值因为计算可能 改变未来,他们应该 整齐地封装在模型中 任何情况。例如,视图不能 计算书籍销售价格为 “$价格* 0.90”。独立于 模型,视图无法制作 关于数据含义的假设。
- 视图无法比较相关数据值,但可以测试 数据的属性,如 是否存在或长度 多值数据值。测试就像 $ bloodPressure< 120必须转移到 医生喜欢保留的模型 降低最大收缩压 在我们身上视图中的表达式必须是 替换为a的存在测试 模拟布尔值的值 $ bloodPressureOk!= null模板输出 可以以模型数据和条件为条件 计算,有条件的 必须在模型中计算。甚至 做出负值的简单测试 红色应该在模型中计算; 正确的抽象级别是usu- 某种更高层次的盟友 “部门x正在赔钱。”
- 视图无法进行数据类型假设。某些类型的假设是 当视图假设数据时显而易见 例如,value是一个日期,但更多 细微类型的假设:如果a 模板假设$ userID是 整数,程序员不能 将此值更改为非数字值 在模型中没有打破 模板。此规则禁止数组 索引,如colorCode [$ topic]和 $ name [$ ID]视图进一步不能 调用带有参数的方法 (静态或动态)有 假定的论证类型,除非一个 可以保证模型方法 仅将它们视为对象。 除了图形设计师不是 程序员;期待他们调用 方法,知道要传递的是什么 不现实的。
- 模型中的数据不得包含显示或布局信息。 模型无法通过任何显示 伪装成视图的信息 数据值。这包括不通过 要应用的模板的名称 其他数据值。
醇>
答案 1 :(得分:3)
在视图渲染方面,我仍然使用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 {{}共同使用Velocity和FreeMarker。尽管Velocity非常轻巧且易于使用,但它在某种程度上受到限制。由于大型现有宏库和JSP包含支持,我更喜欢FreeMarker进行网页呈现。
我还建议SiteMesh进行网页修饰,以避免模板文件将内容与装饰混合在一起。
所以,如果你不需要AJAX页面的幻想,结果是:Freemarker + SiteMesh + Spring MVC。但如果您想知道是否使用AJAX,我建议您查看GWT showcase。