我有一个包含各种区域设置的简单枚举:
public enum LocaleEnum {
en_US,es_MX;
private static EnumMap<LocaleEnum, String> map = new EnumMap<LocaleEnum, String>(LocaleEnum.class);
// Pre-load the descriptive values. Will pull the descriptive value from a property file later.
static {
String desc = "English";
for (LocaleEnum locale : LocaleEnum.values()) {
map.put(locale, desc);
desc = "Espanol";
}
}
public static EnumMap<LocaleEnum, String> getMap() {
return map;
}
}
然后我在模型上有一个方法将EnumMap传递给视图:
public EnumMap<LocaleEnum, String> getLocales() {
EnumMap<LocaleEnum, String> map = LocaleEnum.getMap();
return map;
}
我现在正尝试使用Thymeleaf在下拉列表中显示这些值:
<select th:field="*{locales}">
<option value="NONE">---- Select ----</option>
<option th:each="locale : ${locales}"
th:value="${locale.key}"
th:text="${locale.value}">Englishy</option>
</select>
我得到了&#34; ----选择----&#34;在下拉列表中。在调试模式下,我看到getLocales()方法与EnumMap中的值一起被调用。
但是,下拉列表中没有其他内容。我不断将我的实施与其他人进行比较,但我没有看到我的失败。所有的想法都非常受欢迎。感谢。
答案 0 :(得分:1)
这是一个更有效地使用枚举的解决方案。我明白为什么你使用地图这样你就可以传递整个集合,但有一种更好的方式使用.values()
见下文
public enum LocaleEnum
{
en_US("en_US", "English"), es_MX("es_MX", "Espanol");
private final String locale;
private final String desc;
LocaleEnum(String locale, String desc)
{
this.locale = locale;
this.desc = desc;
}
public String getLocale()
{
return locale;
}
public String getDesc()
{
return desc;
}
}
然后更改将枚举添加到模型的方法。注意.values()
是返回数组的枚举的静态方法。
public LocaleEnum getLocales()
{
return LocaleEnum.values();
}
然后你的百里香页面看起来像
<select th:field="*{locales}">
<option value="NONE">---- Select ----</option>
<option th:each="locale : ${locales}"
th:value="${locale.getLocale()}"
th:text="${locale.getDesc()}">Englishy</option>
</select>
答案 1 :(得分:1)
如何尝试使用<String, String>
类型的地图?
public enum LocaleEnum {
EN_US("en_US", "English"), ES_MX("es_MX", "Espanol");
private final String locale;
private final String lang;
LocaleEnum(String locale, String lang) {
this.locale = locale;
this.lang = lang;
}
public String getLocale() {
return locale;
}
public String getLang() {
return lang;
}
public static Map<String, String> getLocalesAsMap() {
Map<String, String> localeMap = new HashMap<String, String>();
localeMap.put(EN_US.getLocale(), EN_US.getLang());
localeMap.put(ES_MX.getLocale(), ES_MX.getLang());
return localeMap;
}
}
public Map<String, String> getLocales() {
return LocaleEnum.getLocalesAsMap();
}
在Iterable
的情况下,让我们用locales.entrySet()
<select th:field="*{locales}">
<option value="NONE">---- Select ----</option>
<option th:each="locale : ${locales.entrySet()}"
th:value="${locale.key}"
th:text="${locale.value}">Englishy</option>
</select>
答案 2 :(得分:1)
感谢OhioCowboy&amp; Wundwin我非常感谢你的帮助。
我终于弄清楚我做错了什么。我需要做的就是改变:
<option th:each="locale : ${locales}"
到
<option th:each="locale : *{locales}"
现在,我正在理解标记,这是有道理的。