java - 在 JSTL 中使用枚举

标签 java jsp jstl

我正在尝试使用 jSTL 进行一些网站开发,但我遇到了 以下问题:

我在这里尝试创建一个下拉菜单,其中显示的值是 国家名称,值为国家代码。为此我 在后端 java 代码中有以下枚举:

public static enum CountryCodes implements EnumConstant {
       USA, CAN, AUS, GBR, DEU, ESP, GUM, IND, ISR, MEX, NZL, PAN, PRI;

       public final String toCountry(){
               switch(this){
               case USA:
                       return "United States";
               case CAN:
                       return "Canada";
               case AUS:
                       return "Australia";
               case GBR:
                       return "Great Britan";
               case DEU:
                       return "Germany";
               case ESP:
                       return "Spain";
               case GUM:
                       return "Guam";
               case IND:
                       return "India";
               case ISR:
                       return "Isreal";
               case MEX:
                       return "Mexico";
               case NZL:
                       return "New Zealand";
               case PAN:
                       return "Panama";
               case PRI:
                       return "Puerto Rico";

               }
               return this.toString();
       }
}

jsp代码片段如下:

<c:set var="countryCodes" value="<%=RequestConstants.CountryCodes.values()%>" />
<td>
    <select id="<%=RequestConstants.CLModifyPage.COUNTRY_CODE%>"
        name="<%=RequestConstants.CLModifyPage.COUNTRY_CODE%>">
        <c:forEach items="${countryCodes}" var="countryCode">
            <c:choose>
                <c:when
                    test="${sessionScope.CURRENT_INSTITUTION.countryCode == countryCode}">
                    <option value="${countryCode}" selected="selected">
                        ${countryCode.toCountry()}</option>
                </c:when>
                <c:otherwise>
                    <option value="${countryCode}">${countryCode.toCountry()}
                        </option>
                </c:otherwise>
            </c:choose>
        </c:forEach>
    </select>
</td>

但是上面的代码有两个问题:

  1. countryCode.toCountry() 没有真正起作用...我不确定它应该是什么语法。

  2. 如果 "${sessionScope.CURRENT_INSTITUTION.countryCode}" 不是有效的枚举值,即,如果它类似于“AAA”,则比较失败并抛出 java.lang. lang.IllegalArgumentException:未定义枚举常量 CountryCodes.AAA。我该如何解决这个问题?

最佳答案

你的方法太复杂了。

按如下方式重新设计您的枚举:

public enum CountryCode {

    USA("United States"), 
    CAN("Canada"),
    AUS("Australia");
    // ...

    private String label;

    private CountryCode(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

}

(请注意,它现在有一个完全有值(value)且更高效的 setter/getter !)

在 servlet 的 init() 方法期间或更好地在 ServletContextListener 期间将枚举值存储在应用程序范围内的 contextInitialized() 方法:

servletContext.setAttribute("countryCodes", CountryCode.values());

最后遍历如下:

<select name="countryCode">
    <c:forEach items="${countryCodes}" var="countryCode">
        <option value="${countryCode}" ${institution.countryCode == countryCode ? 'selected' : ''}>${countryCode.label}</option>
    </c:forEach>
</select>

关于java - 在 JSTL 中使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6739918/

相关文章:

java - 找不到记录器的附加程序(com.zaxxer.hikari.HikariConfig)

java - 试图在我的应用程序中集成一个拼写检查库

java - BindingResult 和 bean 名称 'configId' 的普通目标对象都不能用作请求属性 Jasper 异常

JSTL 日期比较

java - 根据 JSTL 的键从 hashmap 中获取值

java - 如何使用 Java 按字母顺序对链表进行排序?

java - 将 Set<Map.Entry<K, V>> 转换为 HashMap<K, V>

java - 当 GC 不(必须)运行并且程序完成执行时会发生什么?

java - 如何使用单个 HTML 表单上传图像并通过单个提交按钮存储其详细信息?

javascript - 在 JSTL 条件标记中使用 'div' 类名或标题