在一个应用程序中,我们使用Velocity在模板中合并占位符。因此我们将$ {firstname}合并为用户名,因为我们在合并到VelocityContext Hashmap之前添加它。
代码:
public static String evaluateTemplate(final VelocityContext context, final String template){
try {
velocityEngine.init();
StringWriter writer = new StringWriter();
velocityEngine.evaluate(context, writer, "", template);
return writer.toString();
} catch (Exception e) {
...
}
}
这是一个非常简单的示例,并且总是将第一个名称(即使它未在模板中使用)添加到VelocityContext也不是一个昂贵的操作,因为用户属性字段(来自Hibernate实体的getter)是大多数评估模板时所需的时间(模板可以是个人页面或电子邮件)。但在某些特殊情况下,我们需要一些更“昂贵”的数据。例如,来自其他应用程序的数据来自Web服务。即使模板中没有占位符请求加载信息,也每次都将其放入上下文hashmap。
所以我的问题是,是否有替代模板引擎(我也知道'Freemarker'和'String template')在必要时加载所需的内容?某种延迟加载模板引擎,开销较小
答案 0 :(得分:3)
有可能将多个背景链接在一起,比如你的廉价东西 标准的上下文映射并从那里提供,并且昂贵的(如webservice调用)被委托给您的自定义上下文。这样你就可以提供延迟加载。
速度本身的开销非常小。
答案 1 :(得分:3)
您不必在上下文中放置您可能需要的所有值/所有值。只需将一些对象(或类,如果你想使用静态方法)与getter放在一起来检索值:$myObject.getFirstname()
。对于费力的东西,你可以在需要时拨打电话$myObject.getExpensiveData()
。延迟加载应该在方法getExpensiveData()
内发生,所以如果模板不需要那些东西,那么它就不会调用该方法,因此加载不会发生。
答案 2 :(得分:0)
由于您也问过这个问题,在FreeMarker中,模板上下文(在那里称为数据模型)只需实现TemplateHashModel
接口(或java.util.Map
),因此在您的自定义{{1实现你可以推迟解析变量值,直到模板中第一次需要它为止。