延迟加载模板引擎就像速度一样

时间:2013-02-05 15:46:10

标签: java lazy-loading velocity template-engine freemarker

在一个应用程序中,我们使用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')在必要时加载所需的内容?某种延迟加载模板引擎,开销较小

3 个答案:

答案 0 :(得分:3)

有可能将多个背景链接在一起,比如你的廉价东西 标准的上下文映射并从那里提供,并且昂贵的(如webservice调用)被委托给您的自定义上下文。这样你就可以提供延迟加载。

速度本身的开销非常小。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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