gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:55:53 41 4
gpt4 key购买 nike

我已经熟悉了 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/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com