我可以将一个String []列表传递给Freemarker吗?
问题描述:
我使用freemarker的工艺数据模型是我可以将一个String []列表传递给Freemarker吗?
Map<String, Object> templateDataModel = new HashMap<>();
我有字符串数组列表,我想通过这个地图是这样的:
ArrayList<String[]> listOfServers = new ArrayList<>();
for (Server server : object.getServers) {
String[] ser = new String[2];
//get the name
ser[0] = server.getName();
//get the port
ser[1] = server.getPort();
lostOfServers.add(ser);
}
templateDataModel.put(serverList, listOfServers);
背后的原因arraylist是服务器至少有2个数据点(在这种情况下名称和端口)和一个字符串列表或其他集合不能容纳我需要的东西(如果我错了正确的话)。
在我Freemarker模板,我想循环的服务器列表和显示类似这样的各种不同的值:
<#list serverList as server>
<tr>
<td>${server[0]}</th>
</tr>
<tr>
<td>${server[1]}</th>
</tr>
</#list>
我得到在我的输出这样的信息:
freemarker.template.DefaultObjectWrapper didn't convert java.util.ArrayList to a TemplateHashModel.
Generally, you want to use a Map<String, Object> or a JavaBean as the root-map (aka. data-model) parameter. The Map key-s or JavaBean property names will be the variable names in the template.
似乎就像我不能这样做。它是否正确?如果有的话,freemarker支持使用该数据结构的任何建议?
我是新来的Java,并阅读freemarker。请原谅我不了解的任何基本事项,但我真的很想让这个免费标记的东西起作用。
编辑:************
这里,我已经决定使用
Map<String, List<List<String>>>
代替
Map<String, List<String[]>>
模板现在看起来是这样的:
<#list serverEntries as serverEntry>
<tr>
<#list serverEntry as serverAttribute>
<td>${serverAttribute}</th>
</#list>
</tr>
</#list>
答
从错误消息看起来似乎已通过listOfServers
(或其他一些ArrayList
)至Template.process
(或Environment.process
),而不是templateDataModel
。
我验证了我将Map和StringWriter传递给了template.process方法。感谢输入 –
Alan
我想知道的是,如果有一个Array指令,或者如何使一个 – Alan
@Alan:错误消息说你已经传入一个'ArrayList'。也许你没有看到正确的'Template.process'调用。检查堆栈跟踪中的呼叫来自哪里。我不确定你是什么意思的数组指令。 – ddekany