如何在Freemarker中访问HashMap指定键值?含代码示例及输出需求
问题1:单独访问特定键(如"two")的值
在FreeMarker中,你可以直接通过两种方式访问hello这个Map里的特定键值:
点语法:这是最简洁的写法,直接用
.连接Map名称和键名:${hello.two}执行后会输出
ABC。方括号语法:如果键名包含特殊字符或者是变量时更适用,这里也可以用:
${hello["two"]}同样会输出
ABC。
问题2:修正循环代码生成预期输出
首先要注意:普通HashMap是无序的,迭代键的顺序不一定和你插入的顺序一致。如果需要固定顺序(比如按one→two→three的顺序输出),建议在Java代码里把HashMap换成LinkedHashMap,它会保留插入顺序。
接下来修正循环代码,要实现{key-value-1} {key-value-2} {key-value-3} #define ABC 3的输出,我们可以分两部分处理:
完整修正后的代码:
<#-- 第一部分:输出带序号的key-value标记 --> <#list hello?keys as key> {key-value-${key_index + 1}}<#if key_has_next> </#if> </#list> <#-- 第二部分:输出所有值,用空格分隔 --> ${hello?values?join(" ")}
代码解释:
key_index + 1:FreeMarker的list变量自带index属性(从0开始),加1后得到从1开始的序号。<#if key_has_next> </#if>:用来在元素之间添加空格,避免最后一个元素后面多出空格。hello?values?join(" "):直接获取Map的所有值组成的序列,然后用空格连接起来,比再次循环更简洁。
如果你坚持用两次循环的方式(和第一部分结构一致),也可以写成:
<#-- 输出带序号的标记 --> <#list hello?keys as key> {key-value-${key_index + 1}}<#if key_has_next> </#if> </#list> <#-- 输出每个值 --> <#list hello?keys as key> ${hello[key]}<#if key_has_next> </#if> </#list>
你原来的代码错误在于循环时硬编码了hello["two"],导致每次都输出同一个值,正确的应该是用当前循环的key来获取对应的值:${hello[key]}。
内容的提问来源于stack exchange,提问作者Vili
相关产品推荐
相关产品推荐

