选择正确的模板引擎

oni*_*unn 1 java templates frameworks

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

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

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

Jac*_*eow 7

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

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

如果您有兴趣了解有关该主题/哲学的更多信息,请阅读StringTemplate的创建者在模板引擎中强制执行严格的模型 - 视图分离.

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

  1. 视图不能通过直接更改模型数据对象或通过在模型上调用导致副作用的方法来修改模型. 也就是说,模板可以从模型访问数据并调用方法,但是这样的引用必须是无副作用的.此规则部分产生,因为数据引用必须是顺序不敏感的.见7.1节.
  2. 视图不能对依赖数据值执行计算,因为计算可能在将来发生变化,并且在任何情况下它们都应该整齐地封装在模型中.例如,视图无法将图书销售价格计算为"$ price*.90".为了独立于模型,视图不能对数据的含义做出假设.
  3. 视图无法比较相关数据值,但可以测试数据的属性,例如多值数据值的存在/不存在或长度.像血液压力<120的测试必须转移到模型,因为医生喜欢减少我们的最大收缩压.视图中的表达式必须替换为测试是否存在模拟布尔值的值,例如$ bloodPressureOk!= null模板输出可以以模型数据和计算为条件,条件只需要在模型中计算.即使是使负值为红色的简单测试也应该在模型中计算出来; 正确的抽象级别通常是更高级别的东西,例如"部门x正在亏钱".
  4. 视图无法进行数据类型假设.例如,当视图假定数据值是日期时,某些类型假设是显而易见的,但更精细的类型假设如下:如果模板假定$ userID是整数,则程序员不能将此值更改为非模型中的数字,不会破坏模板.此规则禁止数组索引,例如colorCode [$ topic]和$ name [$ ID]视图进一步无法调用带有参数的方法,因为(静态或动态)存在假定的参数类型,除非可以保证模型方法仅将它们视为对象.除了图形设计师不是程序员; 期望他们调用方法并知道要传递什么是不现实的.
  5. 模型中的数据不得包含显示或布局信息. 模型无法将任何显示信息传递给伪装成数据值的视图.这包括不传递模板名称以应用于其他数据值.