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

标签 java servlets freemarker

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

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

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

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

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

  1. 我有一个简单的 Servlet。

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

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

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

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

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

最佳答案

“工作”真的是一个集合吗?请在您创建和处理模板的地方发布一段代码。

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

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

关于java - 将对象列表传递给 Freemarker 然后循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981495/

相关文章:

java - 如何从实现类中获取泛型接口(interface)的类型参数?

java - JSF 2.0 在整个 session 期间从浏览器和以编程方式设置语言环境

java - 如何在 Spring 测试中注入(inject)有关测试的任何信息?

java - 通过java google api 访问服务

java - Java项目(含前端技术)如何统计KLOC?

java - Spring MVC 中模板引擎处理输出

java - 访问经过身份验证的 servlet

java - 仅记录 http servlet 响应 header

java - Spring Boot 自由标记

java - 如何在 Freemarker 模板中创建列表