2011-05-12 98 views
28

我已經熟悉了Java的模板引擎FreeMarker。將對象列表傳遞給Freemarker然後循環

我已經到了可以通過哈希映射將對象傳遞給模板引擎的地步。這工作正常。但只要我嘗試將任何類型的多個對象傳遞給FreeMarker,它就會給我一個freemarker.template.TemplateException,並且抱怨它「預期收集或序列作業被評估爲freemarker.template.SimpleHash」。

從我所瞭解的各種資源中讀到這一點,這是可以預料的。

現在,我已經完成了很多腿部工作,並找到了許多人評論如何解決這個問題。但坦率地說,(a)對於很多示例,我們不清楚他們的建議在我的案例中的確切用法 - 儘管我已經知道Java基礎知識很久了,但對於某些體系結構有關Java網絡應用和(b)我很困惑哪種方法是最好的方法。

所有我想做的事情,在最簡單的水平,基本上是這樣的:

  1. 我有一個簡單的Servlet。

  2. 我有一個簡單的類(對於這個例子命名爲發票)與幾個方法和屬性。

  3. 我想有我的servlet(以某種方式)經由FreeMarker的的處理方法呈現這些對象的實例(或視圖的那些對象的)的列表/陣列/序列/ HashMap中。

  4. 我想有我.ftl模板做一個循環通過列表/陣列/順序/ HashMap和顯示方法的結果,這樣的事情:

< # list invoices as invoice> 
Invoice note: ${invoice.getNote()}, Invoice Amount:${invoice.getAmount()} 
</# list> 

現在,我不一定要尋找快速的&骯髒的解決方案。我是FreeMarker的新手,但我想以適當的方式做到這一點,那就是優雅和優秀的設計。所以我很樂意徹底重新思考這種方法。有人能幫我看看我需要做些什麼才能使這樣的工作起作用嗎?

+0

BTW:標籤「的FreeType 「指的是一個字體渲染引擎。您應該將此問題標記爲「freemarker」。 – 2011-05-12 17:46:15

回答

37

是 「工作」 真的是一個集合?請在您創建和處理模板的地方張貼一段代碼。

我只是寫了一個快速測試,以檢查:

public void testFreeMarker() throws Exception { 

    List<Invoice> invoices = Arrays.asList(
     new Invoice("note1", "amount1"), 
     new Invoice("note2", "amount2")); 
    Map<String, Object> root = new HashMap<String, Object>(); 
    root.put("invoices", invoices); 
    StringWriter out = new StringWriter(); 

    Configuration cfg = new Configuration(); 
    cfg.setClassForTemplateLoading(FreemarkerUtils.class, "/templates"); 
    cfg.setObjectWrapper(new DefaultObjectWrapper()); 
    Template temp = cfg.getTemplate("listTest.ftl"); 
    temp.process(root, out); 

    System.out.println(out.getBuffer().toString()); 
} 

模板就是:

<#list invoices as invoice> 
Item: ${invoice.note} - ${invoice.amount} 
</#list> 

結果不出所料:

Item: note1 - amount1 
Item: note2 - amount2 
+0

但是,如果我們需要使用列表?我該如何處理。謝謝 – 2013-08-01 16:34:21

+0

爲我工作,但我也必須添加getter方法,如這裏所述http://stackoverflow.com/questions/18329192/accessing-properties-of-objects-within-list – 2015-12-29 21:16:43

0

兩個後續問題和可能離題答案..

問題: 你如何讓你的發票清單提供給Freemarker模板?你可以發佈代碼片段,將它添加到請求/會話/無論什麼?

可能脫離主題的答案: 您是否考慮過使用Spring MVC? Imho它使Freemarker作爲一個網頁模板機制更容易一些。它提供了一個FreemarkerViewRenderer,你可以從你的Web控制器方法中返回一個「ModelAndView」...你可能想看看它。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/view.html#view-velocity

相關問題