Thymeleaf下降没有填充

时间:2014-08-21 02:46:28

标签: java html drop-down-menu map thymeleaf

我有一个包含各种区域设置的简单枚举:

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中的值一起被调用。

但是,下拉列表中没有其他内容。我不断将我的实施与其他人进行比较,但我没有看到我的失败。所有的想法都非常受欢迎。感谢。

3 个答案:

答案 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>类型的地图?

LocaleEnum

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();
}

Thymeleaf页面下拉

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}"

现在,我正在理解标记,这是有道理的。