将对象列表传递给 Freemarker 然后循环

Posted

技术标签:

【中文标题】将对象列表传递给 Freemarker 然后循环【英文标题】:Passing a List of Objects to Freemarker and then Looping 【发布时间】:2011-08-24 07:13:52 【问题描述】:

我已经熟悉了 FreeMarker,这是一个 Java 模板引擎。

我已经到了能够通过哈希映射将对象传递给模板引擎的地步。那行得通。但是,一旦我尝试将任何类型的多个对象的集合传递给 FreeMarker,它就会给我一个 freemarker.template.TemplateException 并抱怨它“预期的集合或序列。作业被评估为 freemarker.template.SimpleHash”。

根据我在各种资源中阅读的理解,这是可以预料的。

现在,我已经完成了很多腿部工作,发现很多人都在评论如何解决这个问题。但是,坦率地说,(a) 对于许多示例,不清楚他们的建议在我的案例中究竟如何应用——尽管我已经了解 Java 基础知识很长一段时间了,但我对某些架构还是很陌生与 Java Web 应用程序有关,并且 (b) 我对哪种方法是最好的方法感到困惑。

在最简化的层面上,我想要做的基本上是这样的:

    我有一个简单的 Servlet。

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

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

    我想让我的 .ftl 模板循环遍历 list/array/sequence/hashmap 并显示方法结果,如下所示:

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

现在,我不一定要为此寻找快速而肮脏的解决方案。我是 FreeMarker 的新手,但我想以优雅和良好设计的正确方式做到这一点。所以我愿意完全重新思考这种方法。有人可以帮我看看我需要做什么才能让这样的事情发挥作用吗?

【问题讨论】:

btw:标签“freetype”指的是字体渲染引擎。您应该将此问题标记为“freemarker”。 【参考方案1】:

“工作”真的是一个集合吗?请在您创建和处理模板的位置发布一个 sn-p 代码。

我刚刚写了一个快速测试来检查:

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 呢?我该如何处理。谢谢 为我工作,但我还必须添加这里提到的 getter 方法***.com/questions/18329192/…【参考方案2】:

一个后续问题和一个可能离题的答案..

问题: 您如何使您的发票列表可用于 freemarker 模板?您能否将代码 sn-p 发布到您将其添加到请求/会话/任何内容的位置?

可能离题的答案: 您是否考虑过使用 Spring MVC?恕我直言,它使使用 Freemarker 作为网页模板机制更容易一些。它提供了一个 FreemarkerViewRenderer,你可以从你的 web 控制器方法中返回一个“ModelAndView”......你可能想看看它。

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

【讨论】:

以上是关于将对象列表传递给 Freemarker 然后循环的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 String[] 列表传递给 Freemarker 吗?

java freemarker 通过ftl模板导出word文档

Swift 3 将 ArrayList 对象变量传递给字符串数组

将带有列表文件的数组传递给 curl 循环

Django:如何通过 AJAX 将 PKID 列表传递给下一个视图,然后重定向

如何使用'for'循环将新变量传递给python脚本