我一直在熟悉FreeMarker,它是Java的模板引擎。
我已经到了能够通过哈希映射将对象传递给模板引擎的地步。这没关系。但是一旦我尝试将任何类型的多个对象集合传递给FreeMarker,它就会给我一个freemarker.template.TemplateException并抱怨它“预期的集合或序列。作业被评估为freemarker.template.SimpleHash”。
根据我在各种资源中阅读的理解,这是可以预期的。
现在,我做了很多腿部工作,发现很多人评论如何解决这个问题。但是,坦率地说,(a)对于许多例子,我不明白他们的建议在我的案例中是如何适用的 - 尽管我已经知道Java基础知识很长一段时间我对一些架构很新关于Java Web应用程序和(b)我对哪种方法是最好的方法感到困惑。
在最简化的层面上,我想要做的就是基本上这样:
我有一个简单的Servlet。
我有一个简单的类(对于这个名为Invoice的例子),它有一些方法和属性。
我希望我的servlet(以某种方式)通过FreeMarker的处理方法呈现这些对象(或这些对象的视图)的实例的列表/数组/序列/散列图。
我想让我的.ftl模板循环遍历list / array / sequence / hashmap并显示方法结果,如下所示:
< # list invoices as invoice>
Invoice note: ${invoice.getNote()}, Invoice Amount:${invoice.getAmount()}
< / # list>
现在,我不一定要寻找快速和快速的肮脏的解决方案。我是FreeMarker的新手,但我希望以优雅和优秀的设计正确的方式做到这一点。所以我愿意完全重新思考这种方法。有人可以帮助我看看我需要做些什么才能让这样的东西起作用吗?
答案 0 :(得分:39)
“工作”真的是一个集合吗?请在您创建和处理模板的位置发布一段代码。
我刚刚写了一个快速测试来检查:
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
答案 1 :(得分:0)
后续问题和可能偏离主题的答案......
问题: 如何将您的发票清单提供给freemarker模板?您可以将代码片段发布到将请求/会话/其他内容添加到其中吗?
可能偏离主题的答案: 你考虑过使用Spring MVC吗? Imho使得使用Freemarker作为网页模板机制更容易一些。它提供了一个FreemarkerViewRenderer,您可以从Web控制器方法返回一个“ModelAndView”......您可能希望看一下它。