将对象列表传递到Freemarker并循环遍历

41

我一直在熟悉 FreeMarker,这是一个用于 Java 的模板引擎。

我已经可以通过哈希映射将对象传递给模板引擎了。这个没问题。但是,一旦我尝试传递任何多个对象的集合时,FreeMarker 就会抛出 freemarker.template.TemplateException 异常,并抱怨“预期集合或序列。jobs 被评估为 freemarker.template.SimpleHash”。

从我在各种资源中阅读的信息来看,我理解这是可以预料到的。

现在,我找到了许多人对如何解决这个问题的评论。但是,坦率地说,(a) 对于许多示例,他们的建议如何适用于我的情况并不清楚——即使我已经知道 Java 基础知识很长时间了,但我对Java Web 应用程序架构的某些方面还很陌生, (b) 我也不确定哪种方法是最好的方法。

在最简化的级别上,我只想做到以下几点:

  1. 我有一个简单的 Servlet。

  2. 我有一个简单的类(在本例中命名为 Invoice),其中包含几个方法和属性。

  3. 我希望我的 Servlet(以某种方式)通过 FreeMarker 的 process 方法呈现这些对象的实例列表/数组/序列/哈希图或这些对象的视图。

  4. 我希望我的 .ftl 模板通过循环遍历这个列表/数组/序列/哈希图并显示方法结果,类似于这样:

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

现在,我并不是一定要寻求一种快速而不太优雅的解决方案。虽然我对FreeMarker不熟悉,但我想以正确、优雅和良好设计的方式来完成此任务。因此,我很乐意完全重新思考这种方法。有人能帮助我看到需要做什么才能使这样的事情工作吗?


顺便说一下:“freetype”标签是指字体渲染引擎。你应该将这个问题标记为“freemarker”。 - st.never
2个回答

51

"jobs"是一个集合吗?请发布一个创建和处理模板的代码片段。

我刚写了一个快速测试以进行检查:

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

但是如果我们需要使用List<Object>怎么办?我该如何处理。谢谢 - Full-Stack Software Engineer
1
对我来说有效,但我还必须添加getter方法,如此处所述https://dev59.com/9HXYa4cB1Zd3GeqP_ODy - Oleg K

0

一个跟进问题和一个可能与主题无关的答案。

问题: 如何使您的发票列表在freemarker模板中可用?您能发布添加到请求/会话/任何其他地方的代码片段吗?

可能与主题无关的答案: 您是否考虑使用Spring MVC?在我看来,它使得使用Freemarker作为网页模板机制更加容易。它提供了一个FreemarkerViewRenderer,您可以从Web控制器方法中返回“ModelAndView”...您可能需要查看一下它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接