freemarker遍历map,注意 root.put("aa",map)
items=itemService.findAllItem();map=newTreeMap<Item,List<SubItem>>();for(Itemitem:ite...
items=itemService.findAllItem();
map=new TreeMap<Item,List<SubItem>>();
for(Item item:items){
subItems=subItemService.findAllSubItem(item.getItemID());
map.put(item, subItems);
}
Map<String,Object> root=new HashMap<String, Object>();
root.put("menumap", map);
我在freemarker中怎样遍历menumap
下面那种已经试过了
<#list menumap?keys as item>
${item.itemName}
${menumap.get(item)}
</#list>
get(item)那里报错,说Item不能转换成String类型,
怎么转换????纠结很久!! 展开
map=new TreeMap<Item,List<SubItem>>();
for(Item item:items){
subItems=subItemService.findAllSubItem(item.getItemID());
map.put(item, subItems);
}
Map<String,Object> root=new HashMap<String, Object>();
root.put("menumap", map);
我在freemarker中怎样遍历menumap
下面那种已经试过了
<#list menumap?keys as item>
${item.itemName}
${menumap.get(item)}
</#list>
get(item)那里报错,说Item不能转换成String类型,
怎么转换????纠结很久!! 展开
2个回答
2013-11-01
展开全部
Map latest = new HashMap();
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
<#list latestProduct?keys as itemKey>
<#if itemKey="url">
url:${latestProduct[itemKey]}
</#if>
<#if itemKey="name">
name:${latestProduct[itemKey]}
</#if>
</#list>
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
<#list latestProduct?keys as itemKey>
<#if itemKey="url">
url:${latestProduct[itemKey]}
</#if>
<#if itemKey="name">
name:${latestProduct[itemKey]}
</#if>
</#list>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2016-01-28
展开全部
freemarker中map的key不能使用非String类型;下面为freemarker工具书中的解释,请参考:
——————————————————————————————————————————
为什么在myMap[myKey]表达式中不能使用非字符串的键?
那现在应该怎么做?
FreeMarker 模板语言(FTL)的“哈希表”类型和Java 的Map 是不同的。FTL 的哈希表
也是一个关联数组,但是它仅仅使用字符串的键。这是因为它是为子变量而引入的(比如
user.password 中的password,它和user["password"]是相同的),而变量
名是字符串。
所以FTL 的哈希表不是通常目的上的,可以被用来使用任意类型的键查找值的关联数组。
而且,它有方法。方法是数据模型的一部分,它们也可以执行所有和计算有关的各种数据模
型,当然你可以为Map 查找在数据模型中添加一些方法。不好的消息是数据模型的构建,
作为一个应用程序的具体问题,是使用FreeMarker 程序员的任务,所以他们的任务是保证
这样的方法可以服务于模板设计者并呈现出来。(然而,当模板开发人员需要调用不是用来
呈现内容的方法时,那么就要考虑数据模型是否足够的简单。也许你应该在数据模型构建阶
段做一些后台运算。在理想的情况下,数据模型包含应该被展示的内容,而不是那些为后期
运算而服务的基本内容。)
如果你阅读过程序开发指南, 那么在技术上你就明白了, 数据模型是
freemarker.template.TemplateModel 对象的树。通常(非必须)由自动包装
(包含)普通Java 对象到TemplateModel 对象方式的数据模型的构建。进行对象包装
的对象是对象包装器,当你配置FreeMarker 时它就被指定了。FreeMarker 本身有一部分即
装即用的对象包装器实现, 也许它们当中使用最多的一个就是
freemarker.ext.beans.BeansWrapper(可以阅读程序开发指南/其它/Bean 的
包装部分获取更多内容,译者注)。如果你使用了它的实例作为对象包装器,那么你向数据
模型中放置的java.util.Map 将会作为一个方法, 那么你可以在模板中编写
myMap(myKey),在内部就会调用Map.get(myKey)方法。对myKey 的类型没有严
格的限制,正如Map.get(Object key)也没有这样的限制。如果myKey 的值由
BeansWrapper 来包装或其他支持解包的对象包装器,或在模板中是以文字形式给出的,
那么值在真正调用Map.get(Object key)方法之前将会被自动解包成普通Java 对象,
所以它不会和TemplateModel 一起调用。
但是那仍然会有问题。Java 的Map 对键的确切的类非常专注,所以对于在模板中计算
的数字类型的键,你不得不将它们转换成合适的Java 类型,否则其中的项就不能被发现。
比如, 如果你在Map 中使用Integer 类型的键, 那么你就必须书写
${myMap.get(123?int)}。这是由FTL 的有意简化的仅有单独数字类型的类型系统
导致的非常丑陋的写法,而Java 区分很多数字类型。(理想情况下,在上述情况中,程序员
保证get 方法自动转换键到Integer 类型,所以这不是模板开发者的问题。这可以由定
制包装器来完成,但是包装器必须知道特定的使用Integer 类型键的Map 对象,假设是
应用程序的特定知识。)注意,当键值直接从数据模型(也就是说,你不用在模板中使用算
数运算来改变它的值)中获取时是不需要转换的,包含当它是方法返回值的情况,而且在包
装之前要是合适的类,因为这样解包的结果将会是原始的类型。
——————————————————————————————————————————
为什么在myMap[myKey]表达式中不能使用非字符串的键?
那现在应该怎么做?
FreeMarker 模板语言(FTL)的“哈希表”类型和Java 的Map 是不同的。FTL 的哈希表
也是一个关联数组,但是它仅仅使用字符串的键。这是因为它是为子变量而引入的(比如
user.password 中的password,它和user["password"]是相同的),而变量
名是字符串。
所以FTL 的哈希表不是通常目的上的,可以被用来使用任意类型的键查找值的关联数组。
而且,它有方法。方法是数据模型的一部分,它们也可以执行所有和计算有关的各种数据模
型,当然你可以为Map 查找在数据模型中添加一些方法。不好的消息是数据模型的构建,
作为一个应用程序的具体问题,是使用FreeMarker 程序员的任务,所以他们的任务是保证
这样的方法可以服务于模板设计者并呈现出来。(然而,当模板开发人员需要调用不是用来
呈现内容的方法时,那么就要考虑数据模型是否足够的简单。也许你应该在数据模型构建阶
段做一些后台运算。在理想的情况下,数据模型包含应该被展示的内容,而不是那些为后期
运算而服务的基本内容。)
如果你阅读过程序开发指南, 那么在技术上你就明白了, 数据模型是
freemarker.template.TemplateModel 对象的树。通常(非必须)由自动包装
(包含)普通Java 对象到TemplateModel 对象方式的数据模型的构建。进行对象包装
的对象是对象包装器,当你配置FreeMarker 时它就被指定了。FreeMarker 本身有一部分即
装即用的对象包装器实现, 也许它们当中使用最多的一个就是
freemarker.ext.beans.BeansWrapper(可以阅读程序开发指南/其它/Bean 的
包装部分获取更多内容,译者注)。如果你使用了它的实例作为对象包装器,那么你向数据
模型中放置的java.util.Map 将会作为一个方法, 那么你可以在模板中编写
myMap(myKey),在内部就会调用Map.get(myKey)方法。对myKey 的类型没有严
格的限制,正如Map.get(Object key)也没有这样的限制。如果myKey 的值由
BeansWrapper 来包装或其他支持解包的对象包装器,或在模板中是以文字形式给出的,
那么值在真正调用Map.get(Object key)方法之前将会被自动解包成普通Java 对象,
所以它不会和TemplateModel 一起调用。
但是那仍然会有问题。Java 的Map 对键的确切的类非常专注,所以对于在模板中计算
的数字类型的键,你不得不将它们转换成合适的Java 类型,否则其中的项就不能被发现。
比如, 如果你在Map 中使用Integer 类型的键, 那么你就必须书写
${myMap.get(123?int)}。这是由FTL 的有意简化的仅有单独数字类型的类型系统
导致的非常丑陋的写法,而Java 区分很多数字类型。(理想情况下,在上述情况中,程序员
保证get 方法自动转换键到Integer 类型,所以这不是模板开发者的问题。这可以由定
制包装器来完成,但是包装器必须知道特定的使用Integer 类型键的Map 对象,假设是
应用程序的特定知识。)注意,当键值直接从数据模型(也就是说,你不用在模板中使用算
数运算来改变它的值)中获取时是不需要转换的,包含当它是方法返回值的情况,而且在包
装之前要是合适的类,因为这样解包的结果将会是原始的类型。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询