簡體   English   中英

像模板引擎一樣的速度進行延遲加載

[英]Lazy Loading with template engine's like velocity

在一個應用程序中,我們使用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實體的獲取器)通常是評估模板(模板可以是個人頁面或電子郵件)。 但是在某些特殊情況下,我們需要一些“昂貴”的數據。 例如,其他應用程序的數據通過Web服務獲取。 即使模板中沒有占位符,也要求它加載信息並每次都將其放置到上下文哈希圖中。

所以我的問題是,是否有替代模板引擎(我也知道“ Freemarker”和“字符串模板”)可以在必要時加載所需的內容? 某種開銷較小的延遲加載模板引擎

可以將多個上下文鏈接在一起,例如,您便宜的東西進入標准的上下文地圖並從那里提供服務,而昂貴的(如webservice調用)則委托給您的自定義上下文。 這樣,您可以提供延遲加載。

速度本身的開銷很小。

您不必將所有/所有可能需要的值放在上下文中。 只需在其中放入一些帶有getter的對象(或者類,如果要使用靜態方法)即可檢索值: $myObject.getFirstname() 對於昂貴的東西,您可以在需要時調用$myObject.getExpensiveData() 延遲加載應該在getExpensiveData()方法內部進行,因此,如果模板不需要該東西,則它不會調用該方法,因此不會發生加載。

既然您也曾問過,在FreeMarker中,模板上下文(在那里稱為數據模型)只需要實現TemplateHashModel接口(或java.util.Map ),因此在您的自定義get(String)實現中,您可以推遲解析變量值,直到在模板中首次需要它為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM