Freemarker:如何使用枚举作为关键字迭代地图 [英] Freemarker: How to iterate through the Map using enums as keys
问题描述
以下代码不起作用,因为Freemarker似乎将[]中的表达式的值转换为String,然后将其用作键,这不是实际预期的。
准备模板模型:
Map< MyEnum,Object> MYMAP;
myMap.put(MyEnum.FOO,Foo);
myMap.put(MyEnum.BAR,Bar);
templateModel.put(myMap,myMap);
my.ftl:
< #list myMap?keys as key>
< #assign value = myMap [key]>
< li> $ {key} = $ {value}< / li>
< /#list>
在 Freemarker文档描述了如何访问枚举本身,但是我没有找到任何关于如何使用枚举作为密钥从哈希中获取值的任何内容。 p>
谢谢。
要解释有关这个文件的文件常见问题,
你不能在myMap [key]表达式中使用非字符串键。您可以使用方法!
所以,您可以创建一个bean,为您提供一种方法来获取Java EnumMap(即)。然后用你的mapp来实例化这个bean,然后把bean放在你的Model中。
class EnumMap
{
HashMap< MyEnum,String> map = new HashMap< MyEnum,String>();
public String getValue(MyEnum e)
{
return map.get(e);
}
..constructor,泛型,getter,setter被遗漏。
}
我对您要完成的一般目标感到有点困惑。如果您只需要列出枚举的值(或者每个值的显示值)。有一个更简单的方法来实现。
解决的一个方法是在Enum实例上放置一个显示值。
ie
枚举MyEnum
{FOO(Foo),
BAR_EXAMPLE(Bar Example);
private String displayValue;
MyEnum(String displayValue)
{
this.displayValue = displayValue;
}
public String getDisplay()
{
return displayValue;
}
}
这样可以让枚举本身进入您的配置,并迭代所有实例。
SimpleHash globalModel = new SimpleHash();
TemplateHashModel enumModels = BeansWrapper.getDefaultInstance()。getEnumModels();
TemplateHashModel myEnumModel =(TemplateHashModel)enumModels.get(your.fully.qualified.enum.MyEnum);
globalModel.put(MyEnum,myEnumModel);
freemarkerConfiguration.setAllSharedVariables(globalModel);
然后,您可以遍历枚举,
< #list MyEnum?value as item>
$ {item.display}
< /#list>
The following code does not work because Freemarker seems to cast the value of the expression inside [] to String and then to use it as a key, which is not what is actually expected.
Preparing a template model:
Map<MyEnum, Object> myMap;
myMap.put(MyEnum.FOO, "Foo");
myMap.put(MyEnum.BAR, "Bar");
templateModel.put("myMap", myMap);
my.ftl:
<#list myMap?keys as key>
<#assign value = myMap[key]>
<li>${key} = ${value}</li>
</#list>
In the Freemarker documentation it is described how to access the Enum itself, but I didn't find anything about how to get a value from a hash using Enum as a key.
Thank you.
To paraphrase Freemarker Documentation FAQ on this,
You can't use non-string keys in the myMap[key] expression. You can use methods!
So, you could create a bean that provides a way for you to get to your Java EnumMap, (i.e). Then just instantiate this bean with your mapp, and put the bean in your Model.
class EnumMap
{
HashMap<MyEnum, String> map = new HashMap<MyEnum, String>();
public String getValue(MyEnum e)
{
return map.get(e);
}
..constructor, generics, getters, setters left out.
}
I'm a little bit confused about what general goal your trying to accomplish. If you just need to list out the values of the enum (or perhaps a display value for each one). There is a much easier way to do it.
One way I've seen this problem solved is by putting a display value on the Enum instances.
i.e
enum MyEnum
{ FOO("Foo"),
BAR_EXAMPLE("Bar Example");
private String displayValue;
MyEnum(String displayValue)
{
this.displayValue = displayValue;
}
public String getDisplay()
{
return displayValue;
}
}
This allows you to put the Enum itself into your configuration, and iterate over all instances.
SimpleHash globalModel = new SimpleHash();
TemplateHashModel enumModels = BeansWrapper.getDefaultInstance().getEnumModels();
TemplateHashModel myEnumModel = (TemplateHashModel) enumModels.get("your.fully.qualified.enum.MyEnum");
globalModel.put("MyEnum", myEnumModel);
freemarkerConfiguration.setAllSharedVariables(globalModel);
Then you can iterate over the enum,
<#list MyEnum?values as item>
${item.display}
</#list>
这篇关于Freemarker:如何使用枚举作为关键字迭代地图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!