2

在一个应用程序中,我们使用 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 服务获取。即使模板中没有请求信息的占位符,它也会每次加载并放入上下文哈希映射中。

所以我的问题是,是否有替代模板引擎(我也知道'Freemarker'和'String template')在必要时加载所需内容?某种开销较小的延迟加载模板引擎

4

3 回答 3

3

您不必将可能需要的所有/所有值都放在上下文中。只需在其中放入一些带有 getter 的对象(或类,如果您想使用静态方法)来检索值:$myObject.getFirstname(). 对于昂贵的东西,您可以在需要时拨打电话$myObject.getExpensiveData()。延迟加载应该发生在方法内部getExpensiveData(),所以如果模板不需要这些东西,那么它就不会调用该方法,因此加载不会发生。

于 2013-02-06T08:42:59.193 回答
3

有可能将多个上下文链接在一起,比如您的廉价内容进入标准上下文映射并从那里提供服务,而昂贵的(如 Web 服务调用)则委托给您的自定义上下文。这样您就可以提供延迟加载。

速度本身的开销很小。

于 2013-02-06T08:14:59.533 回答
0

由于您也问过这个问题,因此在 FreeMarker 中,模板上下文(在此处称为数据模型)只需实现TemplateHashModel接口(或java.util.Map),因此在您的自定义get(String)实现中,您可以推迟解析变量值,直到模板中第一次需要它。

于 2013-02-06T19:17:04.013 回答